-
-
Save marksands/76558707f583dbb8f870 to your computer and use it in GitHub Desktop.
- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { | |
UITableViewRowAction *moreAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"More" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath){ | |
// maybe show an action sheet with more options | |
[self.tableView setEditing:NO]; | |
}]; | |
moreAction.backgroundColor = [UIColor lightGrayColor]; | |
UITableViewRowAction *blurAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Blur" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath){ | |
[self.tableView setEditing:NO]; | |
}]; | |
blurAction.backgroundEffect = [UIVibrancyEffect effectForBlurEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight]]; | |
UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath){ | |
[self.objects removeObjectAtIndex:indexPath.row]; | |
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; | |
}]; | |
return @[deleteAction, moreAction, blurAction]; | |
} | |
// From Master/Detail Xcode template | |
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { | |
if (editingStyle == UITableViewCellEditingStyleDelete) { | |
[self.objects removeObjectAtIndex:indexPath.row]; | |
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; | |
} else if (editingStyle == UITableViewCellEditingStyleInsert) { | |
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. | |
} | |
} |
How can I return the row to its initial position after its action has been triggered?
EDIT: Solved by adding [self.tableView setEditing:NO]
to the action handler per suggestion by @marksands
Updated gist with @maddoggy1979's tips.
Have you successfully placed an image in each action button instead of text?
Did you see a way to add these buttons when swiping from left to right? like in the mail app "mark as read"?
@marksands How to set equal width for UITableViewRowAction?(Delete,More,etc)
how do you swap the title text for an image/icon?
this looks like a work around but not ideal (swift):
deleteAction.backgroundColor = UIColor(patternImage: UIImage(named:"sample")!)
You can have your delete action call the delegate method to simplify things:
let deleteAction = UITableViewRowAction(style: .Default, title: "Delete") { (rowAction, indexPath) -> Void in
self.tableView(tableView, commitEditingStyle: .Delete, forRowAtIndexPath: indexPath)
}
What about buttons that show when the user swipes from left to right direction?
this was super useful! thanks :)
thanks !
Thanks for the snippet...
May be worth noting that the order in which you return the actions determines their position. The first action returned is the right-most action button.
So that its more iOS-like with the delete button at the far right, change the order they are returned as below:
return @[deleteAction, moreAction];
Another point for those that are interested:
UITableViewRowActionStyleDefault => Red(?) button
UITableViewRowActionStyleNormal => Grey Button
UITableViewRowActionStyleDestructive => Red Button
To change the color:
[moreAction setBackgroundColor:[UIColor orangeColor]];
Add blur and vibrancy effects (not sure what's going on here... these seem more targeted to imageViews)
Create a blur effect:
UIBlurEffect *myBlur = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
Add a vibrancy effect to the blur effect if you want:
[moreAction setBackgroundEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight]];
Apply to the action:
[moreAction setBackgroundEffect:[UIVibrancyEffect effectForBlurEffect:myBlur]];
[moreAction setBackgroundEffect:myBlur];