ios objective-c uitableview ios8 uitableviewrowaction

ios - ¿Cómo cambiar el color del título UITableViewRowAction?



objective-c ios8 (7)

Me temo que no hay forma de cambiar el color del título de UITableViewRowAction.

Las únicas cosas que puedes cambiar en la acción son:

  • color de fondo
  • estilo (destructivo (color de fondo rojo, ...)
  • título

Para obtener más información, consulte el Apple Doc UITableViewRowAction

Estoy usando UITableViewRowAction en el método "editActionsForRowAtIndexPath". Puedo cambiar el color de fondo de UITableViewRowAction, pero no puedo cambiar el color del título. Pero me gustaría cambiar el color de UITableViewRowAction. Cualquier información al respecto será apreciable.


Hay una manera de lograr lo que estás buscando. Pero es un poco complicado sin embargo.

Ejemplo de resultado:

La idea de este truco es que puedes modificar el color de fondo. Esto significa que puede establecer UIColor''s + colorWithPatternImage: y establecer una imagen de mapa de bits que coincida con el estilo deseado. Esto puede lograrse creando una imagen usando un editor gráfico o representándolo usando, por ejemplo, Core Graphics. El único problema con esta solución es imitar la longitud del título original con los atributos de texto específicos para que funcione correctamente y también debe establecer el título para la acción de fila de la vista de tabla como una cadena de espacios en blanco para que la celda de la vista de tabla se prepare lo suficiente espacio para usted "botón de acción personalizado". Crear activos png estáticos en photoshop puede ser inapropiado si usa filas de celdas variables.

Esta es una categoría para NSString que crea una cadena de espacios vacíos que creará espacio para su botón personalizado y el segundo generará una imagen de mapa de bits que se colocará como imagen de patrón de fondo. Para los parámetros, debe establecer atributos de texto para el título original, que es básicamente @{NSFontAttributeName: [UIFont systemFontOfSize:18]} , que los atributos de texto deseados. Tal vez hay una mejor manera de lograr esto :)

@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

La segunda parte importante es el código que representa el mapa de bits que se puede utilizar como imagen de patrón para backgroundColor de 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; }

Y luego, cuando estás creando tu acción de filas, puedes hacer algo como esto:

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

Esta solución es obviamente estrafalaria, pero puede lograr los resultados deseados sin utilizar API privadas y en el futuro si algo se rompe, esto no romperá su aplicación. Solo el botón se verá inapropiado.

Ejemplo de resultado:

Este código tiene, por supuesto, mucho espacio para mejoras, cualquier sugerencia es apreciada.


De hecho, hay una forma de cambiar el color del título de UITableViewRowAction. Es un botón. Puede usar el proxy de apariencia UIButton :

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


Rápido

No hay necesidad de meterse con UIButton.appearance ...

Coloque esto en la clase de su celda y cambie UITableViewCellActionButton según sus necesidades.

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 } } } } } } }


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


Puede agregar estas dos funciones en su subclase UITableViewCell y llamar a la función setActionButtonsTitleColor para establecer el color del título de los botones de acción.

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 }


La respuesta de Lee Andrew en 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 } } } } } } } }