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?
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
Vous pouvez y parvenir de deux manières.
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 -
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]
}
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]
}
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\]
}
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
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]
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.
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
.
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