2014-11-12 3 views
12

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

+0

RowAction означает что? Для этого вы можете использовать cell.titlelabe.color. это полезно для вас? –

+0

Из iOS 8, sdk позволяет нам использовать новый метод делегата «editActionsForRowAtIndexPath». Этот метод будет активирован после прокрутки таблицы. Поэтому, используя UITableViewAction, мы получим доступ к кнопке «delete» при прокрутке. – GJDK

+0

ohk ... Вы не можете изменить цвет текста? –

ответ

8

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

Единственное, что вы можете изменить на акции являются:

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

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

+0

Я тоже это проверил. Но все же, я хотел бы знать, есть ли другой способ его настройки. Заранее спасибо. – GJDK

+0

См. Мой ответ ниже, который основан на UITableViewRowAction, являющемся UIButton. Действительно есть способ. – ToddB

17

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

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

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 

Второй важной частью является код, который делает точечный рисунок, который может быть использован в качестве шаблона для изображения 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, и в будущем, если что-то перерывы, это не нарушит ваше приложение. Только кнопка будет выглядеть неуместно.

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

enter image description here

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

+1

Ничего себе, это умно –

+0

Какой размер мне нужно установить для изображения? –

+1

Размер изображения должен быть точно размером кнопки. –

4

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

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

enter image description here

+0

Спасибо, Это работает для меня. Я сделал код UITableViewRowAction кнопка * ниже = [UITableViewRowAction rowActionWithStyle: Название UITableViewRowActionStyleDefault: @» "обработчик:^(UITableViewRowAction * действие, NSIndexPath * indexPath) { NSLog (@" Действие выполнить с кнопкой 1"); }]; button.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @ "XYZ_PNG"]]; [[Внешний вид UIButton] setTitleColor: [UIColor redColor] forState: UIControlStateNormal]; –

+2

Это забавный трюк, но он меняет внешний вид для ВСЕХ UIButtons с тех пор. В результате результаты часто нежелательны, так как многие другие кнопки в вашем интерфейсе изменяются. – MobileVet

+0

, если у меня есть 2 кнопки и вам нужен 2 разных цвета для каждого, как это работает? – jose920405

10

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 
         } 

        } 
       } 
      } 
     } 
    } 

} 
+0

Вы также можете настроить метку кнопки на один уровень выше, вместо 'для просмотра в subview2.subviews', что-то вроде' if let button = subview2 as? UIButton {button.setTitleColor (yourColour, forState: .Normal)} '. Или 'button.titleLabel? .font = yourCustomFont':] – Rygen

+0

Сохраненный мой день !! !!! –

+0

Решение подтверждено на iOS 10.3 – yohannes

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

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 

          } 

         } 

        } 

       } 

      } 

     } 

    } 

} 
+0

Отличный ответ !! –

+0

Можете ли вы обновить этот код до Swift 4, пожалуйста? @ david-seek –

+1

ОК будет делать в течение следующих 72 часов. Вам нужно сначала получить xcode 9. Земля прямо сейчас. сделаю, как только у меня будет приличная wifi @HassanTaleb –

1

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