Cómo hacer fonts y colors personalizados en UITableViewRowAction sin Storyboard

Tengo Classic TableView donde puedes eliminar elementos si deslizas y no haces clic en el button. Sé cómo establecer el background personalizado en la celda, pero no puedo encontrar cómo puedo configurar la fuente y el color personalizados para eso.

¡Gracias por ayudar!

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? { var deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete", handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in println("Delete button clicked!") }) deleteAction.backgroundColor = UIColor.networkingColor() return [deleteAction] } 

¿Cómo usar una fuente personalizada?

Es bastante facil

  1. En primer lugar, debes include tus files de fuente personalizados en tu proyecto.
  2. A continuación, vaya a su file info.plist y agregue una nueva input con la tecla " Fuentes proporcionadas por la aplicación ". Tenga en count que esta input debe ser una matriz.
  3. Luego agregue los nombres de estos files como elementos de esta matriz.

¡Y eso es! Todo lo que necesita es usar la fuente por su nombre como este

cell.textLabel.font = [UIFont fontWithName:@"FontName" size:16];

¿Cómo cambiar el color de la fuente?

Aún más fácil. Todo lo que necesitas es

cell.textlabel.textcolor = UIColor.networkingColor()

Editar:

En su caso, desea cambiar la fuente de RowAction. Entonces pienso en solo 2 soluciones. Uno para usar [UIColor colorWithPatterImage:]

O puede usar [[UIButton appearance] setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal]; porque RowAction contiene un button.

Bueno, la única forma que he encontrado de establecer una fuente personalizada es utilizar el método UIAppearance protocolo UIAppearance . Este método aún no está disponible en Swift, por lo que debes hacerlo en Objective-C.

Hice un método de class en una class Objective-C de utilidad para configurarlo:

 + (void)setUpDeleteRowActionStyleForUserCell { UIFont *font = [UIFont fontWithName:@"AvenirNext-Regular" size:19]; NSDictionary *attributes = @{NSFontAttributeName: font, NSForegroundColorAttributeName: [UIColor whiteColor]}; NSAttributedString *attributedTitle = [[NSAttributedString alloc] initWithString: @"DELETE" attributes: attributes]; /* * We include UIView in the containment hierarchy because there is another button in UserCell that is a direct descendant of UserCell that we don't want this to affect. */ [[UIButton appearanceWhenContainedIn:[UIView class], [UserCell class], nil] setAttributedTitle: attributedTitle forState: UIControlStateNormal]; } 

Esto funciona, pero definitivamente no es ideal. Si no incluye UIView en la jerarquía de contención, entonces también termina afectando el indicador de divulgación (ni siquiera me di count de que el indicador de divulgación era una subclass UIButton). Además, si tiene un button UIB en su celda dentro de una subvista en la celda, ese button también se verá afectado por esta solución.

Teniendo en count las complicaciones, podría ser mejor usar una de las bibliotecas de código abierto más personalizable para las opciones de deslizar la celda de tabla.

Si usa la Jerarquía de vista de debugging de XCode para ver lo que está sucediendo en UITableView cuando los botones de desplazamiento están activos, verá que los elementos UITableViewRowAction se traducen en un button llamado _UITableViewCellActionButton , que figura en UITableViewCellDeleteConfirmationView . Una forma de cambiar las properties del button es interceptarlo cuando se agrega a UITableViewCell . En su class derivada UITableViewCell escriba algo como esto:

 private let buttonFont = UIFont.boldSystemFontOfSize(13) private let confirmationClass: AnyClass = NSClassFromString("UITableViewCellDeleteConfirmationView")! override func addSubview(view: UIView) { super.addSubview(view) // replace default font in swipe buttons let s = subviews.flatMap({$0}).filter { $0.isKindOfClass(confirmationClass) } for sub in s { for button in sub.subviews { if let b = button as? UIButton { b.titleLabel?.font = buttonFont } } } } 

Quiero compartir mi solución para ObjC , esto es solo un truco, pero funciona como esperaba para mí.

 - (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { // this just convert view to `UIImage` UIImage *(^imageWithView)(UIView *) = ^(UIView *view) { UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); [view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; }; // This is where the magic happen, // The width and height must be dynamic (it's up to you how to implement it) // to keep the alignment of the label in place // UIColor *(^getColorWithLabelText)(NSString*, UIColor*, UIColor*) = ^(NSString *text, UIColor *textColor, UIColor *bgColor) { UILabel *lbDelete = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 47, 40)]; lbDelete.font = [UIFont boldSystemFontOfSize:11]; lbDelete.text = text; lbDelete.textAlignment = NSTextAlignmentCenter; lbDelete.textColor = textColor; lbDelete.backgroundColor = bgColor; return [UIColor colorWithPatternImage:imageWithView(lbDelete)]; }; // The `title` which is `@" "` is important it // gives you the space you needed for the // custom label `47[estimated width], 40[cell height]` on this example // UITableViewRowAction *btDelete; btDelete = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@" " handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { NSLog(@"Delete"); [tableView setEditing:NO]; }]; // Implementation // btDelete.backgroundColor = getColorWithLabelText(@"Delete", [UIColor whiteColor], [YJColor colorWithHexString:@"fe0a09"]); UITableViewRowAction *btMore; btMore = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@" " handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { NSLog(@"More"); [tableView setEditing:NO]; }]; // Implementation // btMore.backgroundColor = getColorWithLabelText(@"More", [UIColor darkGrayColor], [YJColor colorWithHexString:@"46aae8"]); return @[btMore, btDelete]; } 

[YJColor colorWithHexString:<NSString>]; Es solo para convertir una cadena hexadecimal a UIColor.

Consulte la captura de pantalla de salida de ejemplo.
introduzca la descripción de la imagen aquí

Esto parece funcionar, al less para configurar el color de la fuente:

 - (void)setupRowActionStyleForTableViewSwipes { UIButton *appearanceButton = [UIButton appearanceWhenContainedInInstancesOfClasses:@[[NSClassFromString(@"UITableViewCellDeleteConfirmationView") class]]]; [appearanceButton setTitleColor:[UIColor lightGrayColor] forState:UIControlStateNormal]; } 
 //The following code is in Swift3.1 func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { let rejectAction = TableViewRowAction(style: UITableViewRowActionStyle.default, title: "\u{2715}\nReject") { action, indexPath in print("didtapReject") } rejectAction.backgroundColor = UIColor.gray let approveAction = TableViewRowAction(style: UITableViewRowActionStyle.default, title: "\u{2713}\nApprove") { action, indexPath in print("didtapApprove") } approveAction.backgroundColor = UIColor.orange return [rejectAction, approveAction] } 

Aquí hay un código Swift que podría ser útil:

 func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) ->[AnyObject]? { let attributes = [NSFontAttributeName: UIFont.systemFontOfSize(UIFont.systemFontSize())] as Dictionary! UIButton.appearance().setAttributedTitle(NSAttributedString(string: "Your Button", attributes: attributes), forState: .Normal) // Things you do... } 

Esto manipulará todos los botones de la aplicación.

Creo que puedes usar este método para cambiar la apariencia solo en uno (o más, puedes definirlo) viewcontrollers:

  //create your attributes however you want to let attributes = [NSFontAttributeName: UIFont.systemFontOfSize(UIFont.systemFontSize())] as Dictionary! //Add more view controller types in the [] UIButton.appearanceWhenContainedInInstancesOfClasses([ViewController.self]) 

Espero que esto haya ayudado.