Использование UITableViewRowAction в методе editActionsForRowAtIndexPath. Я могу изменить цвет фона UITableViewRowAction, но не могу изменить цвет заголовка. Но я хотел бы изменить цвет UITableViewRowAction. Любые материалы в этом отношении будут заметны.Как изменить цвет заголовка UITableViewRowAction?
ответ
Я боюсь, что изменить цвет заголовка UITableViewRowAction невозможно.
Единственное, что вы можете изменить на акции являются:
- BackgroundColor
- стиль (деструктивный (красный BackgroundColor, ...)
- название
Для получения дополнительной информации, обратитесь к Apple Doc UITableViewRowAction
Существует один из способов достижения того, что вы ищем. Но это немного сложно.
Пример результата:
Идея этого трюка в том, что вы можете изменить цвет фона. Это означает, что вы можете установить UIColor + colorWithPatternImage: и установить растровое изображение, соответствующее желаемому стилю. Это может быть достигнуто либо путем создания изображения с помощью графического редактора, либо путем его рендеринга с использованием, например, Core Graphics. Единственная проблема с этим решением заключается в том, что вам нужно подражать оригинальной длине заголовка с определенными текстовыми атрибутами, чтобы он работал правильно, а также вы должны установить заголовок для действия таблицы вида таблицы как строку с пробелами, чтобы ячейка представления таблицы достаточно подготовилась пространство для вас "пользовательская кнопка действия". Создание статических активов png в фотошопе может быть неуместным, если вы используете строки переменных ячеек.
Это категория для NSString, которая создает строку пустых пространств, которая создаст пространство для вашей пользовательской кнопки, а вторая создаст растровое изображение, которое будет помещено в фоновое изображение. Для параметров вы должны установить текстовые атрибуты для исходного заголовка, то есть в основном @{NSFontAttributeName: [UIFont systemFontOfSize:18]}
, чем нужные текстовые атрибуты. Может быть, есть лучший способ для достижения этой цели :)
@implementation NSString (WhiteSpace)
- (NSString *)whitespaceReplacementWithSystemAttributes:(NSDictionary *)systemAttributes newAttributes:(NSDictionary *)newAttributes
{
NSString *stringTitle = self;
NSMutableString *stringTitleWS = [[NSMutableString alloc] initWithString:@""];
CGFloat diff = 0;
CGSize stringTitleSize = [stringTitle sizeWithAttributes:newAttributes];
CGSize stringTitleWSSize;
NSDictionary *originalAttributes = systemAttributes;
do {
[stringTitleWS appendString:@" "];
stringTitleWSSize = [stringTitleWS sizeWithAttributes:originalAttributes];
diff = (stringTitleSize.width - stringTitleWSSize.width);
if (diff <= 1.5) {
break;
}
}
while (diff > 0);
return [stringTitleWS copy];
}
@end
Второй важной частью является код, который делает точечный рисунок, который может быть использован в качестве шаблона для изображения BackgroundColor UITableViewRowAction в.
- (UIImage *)imageForTableViewRowActionWithTitle:(NSString *)title textAttributes:(NSDictionary *)attributes backgroundColor:(UIColor *)color cellHeight:(CGFloat)cellHeight
{
NSString *titleString = title;
NSDictionary *originalAttributes = @{NSFontAttributeName: [UIFont systemFontOfSize:18]};
CGSize originalSize = [titleString sizeWithAttributes:originalAttributes];
CGSize newSize = CGSizeMake(originalSize.width + kSystemTextPadding + kSystemTextPadding, originalSize.height);
CGRect drawingRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, cellHeight));
UIGraphicsBeginImageContextWithOptions(drawingRect.size, YES, [UIScreen mainScreen].nativeScale);
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(contextRef, color.CGColor);
CGContextFillRect(contextRef, drawingRect);
UILabel *label = [[UILabel alloc] initWithFrame:drawingRect];
label.textAlignment = NSTextAlignmentCenter;
label.attributedText = [[NSAttributedString alloc] initWithString:title attributes:attributes];
[label drawTextInRect:drawingRect];
//This is other way how to render string
// CGSize size = [titleString sizeWithAttributes:attributes];
// CGFloat x = (drawingRect.size.width - size.width)/2;
// CGFloat y = (drawingRect.size.height - size.height)/2;
// drawingRect.origin = CGPointMake(x, y);
// [titleString drawInRect:drawingRect withAttributes:attributes];
UIImage *returningImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return returningImage;
}
И тогда, когда вы создаете свои действия строки вы можете сделать что-то вроде этого:
NSDictionary *systemAttributes = @{ NSFontAttributeName: [UIFont systemFontOfSize:18] };
NSDictionary *newAttributes = @{NSFontAttributeName: [UIFont fontWithName:@"Any font" size:15]};
NSString *actionTitle = @"Delete";
NSString *titleWhiteSpaced = [actionTitle whitespaceReplacementWithSystemAttributes:systemTextFontAttributes newAttributes:newAttributes];
UITableViewRowAction *rowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:titleWhiteSpaced handle:NULL];
UIImage *patternImage = [self imageForTableViewRowActionWithTitle:actionTitle textAttributes:newAttributes backgroundColor:[UIColor redColor] cellHeight:50];
rowAction.backgroundColor = [UIColor colorWithPatternImage:patternImage];
Это решение, очевидно, Hacky, но вы можете достичь желаемых результатов без использования частных API, и в будущем, если что-то перерывы, это не нарушит ваше приложение. Только кнопка будет выглядеть неуместно.
Пример результата:
Этот код имеет, конечно, много места для улучшений, любые предложения приветствуются.
Ничего себе, это умно –
Какой размер мне нужно установить для изображения? –
Размер изображения должен быть точно размером кнопки. –
Существует действительно способ изменить цвет заголовка UITableViewRowAction. Это кнопка. Вы можете использовать UIButton
внешний вид прокси:
[[UIButton appearance] setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
Спасибо, Это работает для меня. Я сделал код UITableViewRowAction кнопка * ниже = [UITableViewRowAction rowActionWithStyle: Название UITableViewRowActionStyleDefault: @» "обработчик:^(UITableViewRowAction * действие, NSIndexPath * indexPath) { NSLog (@" Действие выполнить с кнопкой 1"); }]; button.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @ "XYZ_PNG"]]; [[Внешний вид UIButton] setTitleColor: [UIColor redColor] forState: UIControlStateNormal]; –
Это забавный трюк, но он меняет внешний вид для ВСЕХ UIButtons с тех пор. В результате результаты часто нежелательны, так как многие другие кнопки в вашем интерфейсе изменяются. – MobileVet
, если у меня есть 2 кнопки и вам нужен 2 разных цвета для каждого, как это работает? – jose920405
Swift
Нет необходимости возиться с UIButton.appearance ...
Поместите это в классе и изменения вашей клетки UITableViewCellActionButton в соответствии с вашими потребностями.
override func layoutSubviews() {
super.layoutSubviews()
for subview in self.subviews {
for subview2 in subview.subviews {
if (String(subview2).rangeOfString("UITableViewCellActionButton") != nil) {
for view in subview2.subviews {
if (String(view).rangeOfString("UIButtonLabel") != nil) {
if let label = view as? UILabel {
label.textColor = YOUR COLOUR
}
}
}
}
}
}
}
Вы также можете настроить метку кнопки на один уровень выше, вместо 'для просмотра в subview2.subviews', что-то вроде' if let button = subview2 as? UIButton {button.setTitleColor (yourColour, forState: .Normal)} '. Или 'button.titleLabel? .font = yourCustomFont':] – Rygen
Сохраненный мой день !! !!! –
Решение подтверждено на iOS 10.3 – yohannes
-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewRowAction *editAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"edit" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
{
// Action something here
}];
editAction.backgroundColor = [UIColor whiteColor];
[[UIButton appearance] setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
return @[editAction];
Lee Andrew's answer в Swift 3/Swift 4:
class MyCell: UITableViewCell {
override func layoutSubviews() {
super.layoutSubviews()
for subview in self.subviews {
for sub in subview.subviews {
if String(describing: sub).range(of: "UITableViewCellActionButton") != nil {
for view in sub.subviews {
if String(describing: view).range(of: "UIButtonLabel") != nil {
if let label = view as? UILabel {
label.textColor = UIColor.black
}
}
}
}
}
}
}
}
Отличный ответ !! –
Можете ли вы обновить этот код до Swift 4, пожалуйста? @ david-seek –
ОК будет делать в течение следующих 72 часов. Вам нужно сначала получить xcode 9. Земля прямо сейчас. сделаю, как только у меня будет приличная wifi @HassanTaleb –
Вы можете добавить эти две функции в вашем UITableViewCell
подкласса и вызвать функцию setActionButtonsTitleColor
установить кнопки действий заголовка цвет.
func setActionButtonsTitleColor(color: UIColor) {
let actionButtons: [UIButton] = self.getActionButtons()
for actionButton in actionButtons {
actionButton.setTitleColor(color, for: .normal)
}
}
func getActionButtons() -> [UIButton] {
let actionButtons: [UIButton] = self.subviews.map {
(view: UIView) -> [UIView] in
return view.subviews
}
.joined()
.filter {
(view: UIView) -> Bool in
return String(describing: view).contains("UITableViewCellActionButton")
}.flatMap {
(view: UIView) -> UIButton? in
return view as? UIButton
}
return actionButtons
}
RowAction означает что? Для этого вы можете использовать cell.titlelabe.color. это полезно для вас? –
Из iOS 8, sdk позволяет нам использовать новый метод делегата «editActionsForRowAtIndexPath». Этот метод будет активирован после прокрутки таблицы. Поэтому, используя UITableViewAction, мы получим доступ к кнопке «delete» при прокрутке. – GJDK
ohk ... Вы не можете изменить цвет текста? –