web-dev-qa-db-fra.com

Titre UITableViewRowAction sous forme d'icône d'image au lieu de texte

Je veux mettre l'icône (image) à la place du texte dans les actions de balayage dans tableviewCell dans Swift.

Mais je ne sais pas comment mettre l'image au lieu du texte du titre?

Mon code est ci-dessous:

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]?  {

    var shareAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Share" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in
        // 2
        let shareMenu = UIAlertController(title: nil, message: "Share using", preferredStyle: .ActionSheet)

        let twitterAction = UIAlertAction(title: "Twitter", style: UIAlertActionStyle.Default, handler: nil)
        let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil)

        shareMenu.addAction(twitterAction)
        shareMenu.addAction(cancelAction)


        self.presentViewController(shareMenu, animated: true, completion: nil)
    })
    // 3
    var rateAction =    (style: UITableViewRowActionStyle.Default, title: "rate",im , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in
        // 4

        let rateMenu = UIAlertController(title: nil, message: "Rate this App", preferredStyle: .ActionSheet)

        let appRateAction = UIAlertAction(title: "Rate", style: UIAlertActionStyle.Default, handler: nil)
        let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil)

        rateMenu.addAction(appRateAction)
        rateMenu.addAction(cancelAction)


        self.presentViewController(rateMenu, animated: true, completion: nil)
    })

    // 5
    return [shareAction,rateAction]
}

Pouvez-vous quelqu'un m'aider à ce sujet?

Merci d'avance

26
dhaval shah

Vous pouvez y parvenir de deux manières.

  • Utilisez des caractères Unicode dans votre texte, si cela vous convient. Cependant, les caractères Unicode sont limités.
  • Utilisez emojis à condition que cela serve votre but.

Voici comment vous le faites dans le code 

 override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
    let delete = UITableViewRowAction(style: .Default, title: "\u{267A}\n Delete") { action, index in
        print("more button tapped")
        self.tableView(tableView, commitEditingStyle: UITableViewCellEditingStyle.Delete, forRowAtIndexPath: indexPath)
    }
    delete.backgroundColor = UIColor(rgba: "#ef3340")

    let apply = UITableViewRowAction(style: .Default, title: "\u{2606}\n Like") { action, index in
        print("favorite button tapped")
        self.tableView(tableView, commitEditingStyle: UITableViewCellEditingStyle.Insert, forRowAtIndexPath: indexPath)
    }
    apply.backgroundColor = UIColor.orangeColor()

    let take = UITableViewRowAction(style: .Normal, title: "\u{2605}\n Rate") { action, index in
        print("share button tapped")
        self.tableView(tableView, commitEditingStyle: UITableViewCellEditingStyle.None, forRowAtIndexPath: indexPath)
    }
    take.backgroundColor = UIColor(rgba: "#00ab84")

    return [take, apply, delete]
}

C’est ce que j’aurais pu réaliser par les moyens mentionnés ci-dessus -

 enter image description here

49
AppsWise

Dans iOS 11, Apple fournit un moyen de nous aider à le faire .

public func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
public func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?

Par exemple:

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let deleteAction = UIContextualAction(style: .normal, title:  "", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            // Call edit action

            // Reset state
            success(true)
        })
        deleteAction.image = UIImage(named: "ic_delete")
        deleteAction.backgroundColor = .red
        return UISwipeActionsConfiguration(actions: [deleteAction])
    }

Si vous voulez l'appliquer pour iOS <11.0, vous pouvez le faire de manière délicate

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {

        let deleteAction = UITableViewRowAction(style: .default, title: "") { action, indexPath in
            // Handle delete action
        }
        (UIButton.appearance(whenContainedInInstancesOf: [UIView.self])).setImage(UIImage(named: "ic_delete"), for: .normal)
        return [deleteAction]
    }
22
Martin Le

Essaye ça

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {

    let remove = UITableViewRowAction(style: .Default, title: "      ") { action, indexPath in


        print("delete button tapped")
    }

    remove.backgroundColor = UIColor(patternImage: UIImage(named: "Delete")!)

    return [remove]
}

 enter image description here

3
Abhijeet Mallick

Vérifiez ci-dessous le code de travail

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> \[UITableViewRowAction\]? {


            let backView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: tableView.frame.size.height))
            backView.backgroundColor = UIColor(red: 239/255.0, green: 34/255.0, blue: 91/255.0, alpha: 1.0)

            let frame = tableView.rectForRow(at: indexPath)


            let myImage = UIImageView(frame: CGRect(x: 20, y: frame.size.height/2-20, width: 35, height: 35))
            myImage.image = UIImage(named: "delete_white")!
            backView.addSubview(myImage)

            let imgSize: CGSize = tableView.frame.size
            UIGraphicsBeginImageContextWithOptions(imgSize, false, UIScreen.main.scale)
            let context = UIGraphicsGetCurrentContext()
            backView.layer.render(in: context!)
            let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
            UIGraphicsEndImageContext()

            let deleteAction = UITableViewRowAction(style: .destructive, title: "           ") {
                (action, indexPath) in
                self.deleteCartItem(indexPath: indexPath )
                self.addWebtrendsForCart(path: "/Basket/EditBasket", description: "Edit Basket")
            }

             deleteAction.backgroundColor = UIColor(patternImage: newImage)
             return \[deleteAction\]
        }

 enter image description here

2
Jasmine John

Pas Swift, mais pour tous les autres qui atterrissent ici à la recherche d'une solution ... J'ai de bons résultats avec la simple sous-classe suivante:

@interface GSBTableViewRowAction : UITableViewRowAction
@property UIImage *icon;
@property UIFont *font;
+ (instancetype)rowActionWithStyle:(UITableViewRowActionStyle)style title:(NSString *)title icon:(UIImage*)icon handler:(void (^)(UITableViewRowAction *action, NSIndexPath *indexPath))handler;
@end

@implementation GSBTableViewRowAction
+ (instancetype)rowActionWithStyle:(UITableViewRowActionStyle)style title:(NSString *)title icon:(UIImage*)icon handler:(void (^)(UITableViewRowAction *action, NSIndexPath *indexPath))handler
{
    if (title.length) title = [@"\n" stringByAppendingString:title]; // move title under centerline; icon will go above
    GSBTableViewRowAction *action = [super rowActionWithStyle:style title:title handler:handler];
    action.icon = icon;
    return action;
}

- (void)_setButton:(UIButton*)button
{
    if (self.font) button.titleLabel.font = self.font;
    if (self.icon) {
        [button setImage:[self.icon imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateNormal];
        button.tintColor = button.titleLabel.textColor;
        CGSize titleSize = [button.titleLabel.text sizeWithAttributes:@{NSFontAttributeName:button.titleLabel.font}];
        button.imageEdgeInsets = UIEdgeInsetsMake(-(titleSize.height/2 + 5), 0, 0, -titleSize.width); // +5px gap under icon
    }

Le rowActionWithStyle:title:icon:handler n’est en réalité qu’une méthode pratique - la "sauce secrète" a priorité sur la méthode (privée?) _SetButton [nous remercions Jayesh pour cela!].

Cela vous donnera une icône centrée sur le titre, ou seulement l'icône si vous laissez le titre à zéro. Malheureusement, vous ne pouvez pas modifier la position du titre à l'aide de button.titleEdgeInsets, comme vous pouvez le faire avec imageEdgeInsets, je peux donc placer le titre immédiatement sous la ligne centrale (d'où le '\ n') avec un petit espace sous l'icône (5px au-dessus ). Les résultats ressemblent

 row action with title + icon

En prime, vous pouvez également changer la police de titre, pour dire quelque chose de plus petit, en définissant la nouvelle propriété font. par exemple, l'action "Ajouter" ci-dessus a été réalisée avec

GSBTableViewRowAction *add = [GSBTableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal
                                                               title:@"Add"
                                                                icon:[UIImage imageNamed:@"Today-25"]
                                                             handler:^(UITableViewRowAction *action, NSIndexPath *indexPath){
                                                                 [self addToCalendar:self];
                                                                 [tableView setEditing:NO animated:YES];
                                                             }];
add.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote];
add.backgroundColor = UIColor.orangeColor;

Mise en garde: _setButton est une API privée, donc YMMV ... Nous espérons tous qu'Apple exposera une API publique pour faire ce qu'ils font apparemment dans leur Mail.app [sic]

2
tiritea

Je cherchais à faire la même chose et j'ai trouvé une réponse ici . C'est un peu une solution de contournement. 

De plus, comme le montre la version 9 de iOS 9, je pense que cela sera possible, mais je n'ai pas encore examiné les API. 

1
Acoop

trailingSwipeActionsConfigurationForRowAtIndexPath fonctionne uniquement avec iOS 11 et n'est pas personnalisable. Vous pouvez modifier la couleur d'arrière-plan d'un bouton, mais vous ne pouvez pas ajouter d'image avec vos propres couleurs, même si vous utilisez UIImageRenderingModeAlwaysOriginal

J'ai fini par utiliser MGSwipeTableCell.

1
wzbozon

Si vous utilisez la réponse "Apps Wise" ( https://stackoverflow.com/a/32735211/6249148 ), vous pouvez utiliser cette table pour les caractères unicode courants: https: // tutorialzine. com/2014/12/vous n'avez pas besoin d'icônes-ici-êtes-100-symboles-unicode-que-vous-pouvez-utiliser

Ou celui-ci pour TOUS les caractères unicode: https://unicode-table.com/fr/#control-character

0
Ahmed Karim