Как изменить цвет заголовка UITableViewRowAction?

Использует UITableViewRowAction в методе editActionsForRowAtIndexPath. Я могу изменить цвет фона UITableViewRowAction, но не могу изменить цвет заголовка. Но я хотел бы изменить цвет UITableViewRowAction. Любые входы в этом отношении будут заметны.

Ответ 1

Я боюсь, что нет способа изменить цвет заголовка UITableViewRowAction.

Единственное, что вы можете изменить в действии:

  • BackgroundColor
  • стиль (деструктивный (красный цвет фона,...)
  • название

Для получения дополнительной информации см. Apple Doc UITableViewRowAction

Ответ 2

Существует один способ добиться того, что вы ищете. Но это немного сложно.

Пример результата:

enter image description here

Идея этого трюка состоит в том, что вы можете изменить цвет фона. Это означает, что вы можете установить 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

Вторая важная часть - это код, который отображает растровое изображение, которое может использоваться как образ изображения для UITableViewRowAction backgroundColor.

- (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]; 

Это решение явно взломано, но вы можете достичь желаемых результатов, не используя частные API, и в будущем, если что-то сломается, это не повредит ваше приложение. Только кнопка будет выглядеть неуместно.

Пример результата:

enter image description here

У этого кода, конечно, много места для улучшений, любые предложения оценены.

Ответ 3

Свифта

Не нужно возиться с 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
                        }

                    }
                }
            }
        }
    }

}

Ответ 4

Есть действительно способ изменить цвет заголовка UITableViewRowAction. Это кнопка. Вы можете использовать прокси-сервер UIButton:

[[UIButton appearance] setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];

enter image description here

Ответ 5

Ли Эндрю отвечает в 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

                            }

                        }

                    }

                }

            }

        }

    }

}

Ответ 6

Вы можете добавить эти две функции в свой подкласс 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
}

Ответ 7

-(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];