User view in UITableViewCell while scrolling left. Objective-C or Swift

How to do custom editing in iOS7 UITableView with Objective-C, like Evernote or Apple Reminders, swipe left. I tried installing a custom editAccessoryView, but that didn't work.

Evernote edit view:

enter image description here View reminders:

enter image description here

My current code

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { return YES; } - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { NSLog(@"delete"); } } 

I tried to solve the problem with: (UITableViewController.h)

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //make cell UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; [view setBackgroundColor:[UIColor greenColor]]; //add Buttons to view cell.editingAccessoryView = view; return cell; } 

And the same thing: (UITableViewCell)

 - (void)willTransitionToState:(UITableViewCellStateMask)state; - (void)setEditing:(BOOL)editing animated:(BOOL)animated; - (UIView*)editingAccessoryView; 
+61
ios objective-c uitableview swift swipe
Oct 03 '13 at 16:19
source share
10 answers

Just copy the code below!

 -(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewRowAction *editAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"Clona" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath){ //insert your editAction here }]; editAction.backgroundColor = [UIColor blueColor]; UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath){ //insert your deleteAction here }]; deleteAction.backgroundColor = [UIColor redColor]; return @[deleteAction,editAction]; } 
+81
Mar 20 '15 at 12:12
source share

Swift 3

 func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { let editAction = UITableViewRowAction(style: .normal, title: "Edit") { (rowAction, indexPath) in //TODO: edit the row at indexPath here } editAction.backgroundColor = .blue let deleteAction = UITableViewRowAction(style: .normal, title: "Delete") { (rowAction, indexPath) in //TODO: Delete the row at indexPath here } deleteAction.backgroundColor = .red return [editAction,deleteAction] } 

Swift 2.1

 func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? { let editAction = UITableViewRowAction(style: .Normal, title: "Edit") { (rowAction:UITableViewRowAction, indexPath:NSIndexPath) -> Void in //TODO: edit the row at indexPath here } editAction.backgroundColor = UIColor.blueColor() let deleteAction = UITableViewRowAction(style: .Normal, title: "Delete") { (rowAction:UITableViewRowAction, indexPath:NSIndexPath) -> Void in //TODO: Delete the row at indexPath here } deleteAction.backgroundColor = UIColor.redColor() return [editAction,deleteAction] } 

Note: for iOS 8 forward

+36
Nov 17 '15 at 2:54
source share

Follow this link: https://github.com/TeehanLax/UITableViewCell-Swipe-for-Options

And customize your uitableviewcell with a few buttons.

  UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds))]; scrollView.contentSize = CGSizeMake(CGRectGetWidth(self.bounds) + kCatchWidth, CGRectGetHeight(self.bounds)); scrollView.delegate = self; scrollView.showsHorizontalScrollIndicator = NO; [self.contentView addSubview:scrollView]; self.scrollView = scrollView; UIView *scrollViewButtonView = [[UIView alloc] initWithFrame:CGRectMake(CGRectGetWidth(self.bounds) - kCatchWidth, 0, kCatchWidth, CGRectGetHeight(self.bounds))]; self.scrollViewButtonView = scrollViewButtonView; [self.scrollView addSubview:scrollViewButtonView]; // Set up our two buttons UIButton *moreButton = [UIButton buttonWithType:UIButtonTypeCustom]; moreButton.backgroundColor = [UIColor colorWithRed:0.78f green:0.78f blue:0.8f alpha:1.0f]; moreButton.frame = CGRectMake(0, 0, kCatchWidth / 3.0f, CGRectGetHeight(self.bounds)); [moreButton setTitle:@"More" forState:UIControlStateNormal]; [moreButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [moreButton addTarget:self action:@selector(userPressedMoreButton:) forControlEvents:UIControlEventTouchUpInside]; [self.scrollViewButtonView addSubview:moreButton]; UIButton *shareButton = [UIButton buttonWithType:UIButtonTypeCustom]; shareButton.backgroundColor = [UIColor colorWithRed:0.0f green:0.0f blue:1.0f alpha:1.0f]; shareButton.frame = CGRectMake(kCatchWidth / 3.0f, 0, kCatchWidth / 3.0f, CGRectGetHeight(self.bounds)); [shareButton setTitle:@"Share" forState:UIControlStateNormal]; [shareButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [shareButton addTarget:self action:@selector(userPressedMoreButton:) forControlEvents:UIControlEventTouchUpInside]; [self.scrollViewButtonView addSubview:shareButton]; UIButton *deleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; deleteButton.backgroundColor = [UIColor colorWithRed:1.0f green:0.231f blue:0.188f alpha:1.0f]; deleteButton.frame = CGRectMake(kCatchWidth / 3.0f+kCatchWidth / 3.0f, 0, kCatchWidth / 3.0f, CGRectGetHeight(self.bounds)); [deleteButton setTitle:@"Delete" forState:UIControlStateNormal]; [deleteButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [deleteButton addTarget:self action:@selector(userPressedDeleteButton:) forControlEvents:UIControlEventTouchUpInside]; [self.scrollViewButtonView addSubview:deleteButton]; UIView *scrollViewContentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds))]; scrollViewContentView.backgroundColor = [UIColor whiteColor]; [self.scrollView addSubview:scrollViewContentView]; self.scrollViewContentView = scrollViewContentView; UILabel *scrollViewLabel = [[UILabel alloc] initWithFrame:CGRectInset(self.scrollViewContentView.bounds, 10, 0)]; self.scrollViewLabel = scrollViewLabel; [self.scrollViewContentView addSubview:scrollViewLabel]; 
  • I implemented this code with my application that got this result. You can add the number of buttons in the scroll cell.

    Screenshots implemented here

    enter image description here After scrolling through the cell 3 buttons, โ€œMoreโ€, โ€œShareโ€, โ€œDeleteโ€ are displayed.

+11
Jan 04
source share

You can use the UITableViewRowAction backgroundColor to set a custom image or view. The trick is to use UIColor(patternImage:) .

Basically, the width of a UITableViewRowAction region is determined by its title, so you can find the exact length of the title (or space) and set the exact size of the image using patternImage .

To implement this, I made a UIView extension to the UIView .

 func image() -> UIImage { UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0) guard let context = UIGraphicsGetCurrentContext() else { return UIImage() } layer.render(in: context) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image! } 

and make a line with spaces and exact length,

 fileprivate func whitespaceString(font: UIFont = UIFont.systemFont(ofSize: 15), width: CGFloat) -> String { let kPadding: CGFloat = 20 let mutable = NSMutableString(string: "") let attribute = [NSFontAttributeName: font] while mutable.size(attributes: attribute).width < width - (2 * kPadding) { mutable.append(" ") } return mutable as String } 

and now you can create a UITableViewRowAction .

 func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { let whitespace = whitespaceString(width: kCellActionWidth) let deleteAction = UITableViewRowAction(style: .'default', title: whitespace) { (action, indexPath) in // do whatever you want } // create a color from patter image and set the color as a background color of action let kActionImageSize: CGFloat = 34 let view = UIView(frame: CGRect(x: 0, y: 0, width: kCellActionWidth, height: kCellHeight)) view.backgroundColor = UIColor.white let imageView = UIImageView(frame: CGRect(x: (kCellActionWidth - kActionImageSize) / 2, y: (kCellHeight - kActionImageSize) / 2, width: 34, height: 34)) imageView.image = UIImage(named: "x") view.addSubview(imageView) let image = view.image() deleteAction.backgroundColor = UIColor(patternImage: image) return [deleteAction] } 

The result will look like this.

enter image description here

Another way to do this is to import a custom font that has the image you want to use as the font and use UIButton.appearance . However, this will affect other buttons unless you manually set a different font for the button.

In iOS 11, this message will be displayed [TableView] Setting a pattern color as backgroundColor of UITableViewRowAction is no longer supported. It currently works, but it will not work in a future update.

+11
Feb 09 '17 at 19:35
source share

You can try this,

 func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { let backView = UIView(frame: CGRect(x: 0, y: 0, width: 80, height: 80)) backView.backgroundColor = #colorLiteral(red: 0.933103919, green: 0.08461549133, blue: 0.0839477703, alpha: 1) let myImage = UIImageView(frame: CGRect(x: 30, y: backView.frame.size.height/2-14, width: 16, height: 16)) myImage.image = #imageLiteral(resourceName: "rubbish-bin") backView.addSubview(myImage) let label = UILabel(frame: CGRect(x: 0, y: myImage.frame.origin.y+14, width: 80, height: 25)) label.text = "Remove" label.textAlignment = .center label.textColor = UIColor.white label.font = UIFont(name: label.font.fontName, size: 14) backView.addSubview(label) 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 delete = UITableViewRowAction(style: .destructive, title: " ") { (action, indexPath) in print("Delete") } delete.backgroundColor = UIColor(patternImage: newImage) return [delete, share] } 
+7
Sep 20 '17 at 7:46 on
source share
 override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? { let delete = UITableViewRowAction(style: .Destructive, title: "Delete") { (action, indexPath) in // delete item at indexPath } let share = UITableViewRowAction(style: .Normal, title: "Disable") { (action, indexPath) in // share item at indexPath } share.backgroundColor = UIColor.blueColor() return [delete, share] } 

The code above shows how to create custom buttons when scrolling through a line.

+2
Nov 08 '15 at 23:02
source share

If you want to use only text when performing swipe actions, you can use the default delete actions for iOS, but if you want an image and text, then you must configure it. I found a great tutorial and sample that can solve this problem.

Try this repository to get a custom cleanup cell. Here you can add several options.

http://iosbucket.blogspot.in/2016/04/custom-swipe-table-view-cell_16.html

https://github.com/pradeep7may/PKSwipeTableViewCell

enter image description here

+2
Apr 16 '16 at 18:15
source share

I think this is not the best way to use cells based on UIGestureRecognizer.

First, you will not be able to use CoreGraphics.

Ideal solution, UIResponder or one UIGestureRecognizer to view the entire table. Not for every UITableViewCell . This will make you application stuck.

0
May 20 '14 at
source share

Create a view in a custom cell in a table view and apply PanGestureRecognizer to the view in the cell. Add buttons to the user cell when you swipe the screen in the user cell, then the buttons in the user cell will be visible.

  UIGestureRecognizer* recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; recognizer.delegate = self; [YourView addGestureRecognizer:recognizer]; 

And handle the pan in the view in the method

  if (recognizer.state == UIGestureRecognizerStateBegan) { // if the gesture has just started, record the current centre location _originalCenter = vwCell.center; } // 2 if (recognizer.state == UIGestureRecognizerStateChanged) { // translate the center CGPoint translation = [recognizer translationInView:self]; vwCell.center = CGPointMake(_originalCenter.x + translation.x, _originalCenter.y); // determine whether the item has been dragged far enough to initiate / complete _OnDragRelease = vwCell.frame.origin.x < -vwCell.frame.size.width / 2; } // 3 if (recognizer.state == UIGestureRecognizerStateEnded) { // the frame this cell would have had before being dragged CGPoint translation = [recognizer translationInView:self]; if (_originalCenter.x+translation.x<22) { vwCell.center = CGPointMake(22, _originalCenter.y); IsvwRelease=YES; } CGRect originalFrame = CGRectMake(0, vwCell.frame.origin.y, vwCell.bounds.size.width, vwCell.bounds.size.height); if (!_deleteOnDragRelease) { // if the item is not being dragged far enough , snap back to the original location [UIView animateWithDuration:0.2 animations:^{ vwCell.frame = originalFrame; } ]; } } 
0
Feb 23 '15 at 9:29
source share
  func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { // action one let editAction = UITableViewRowAction(style: .default, title: "Edit", handler: { (action, indexPath) in print("Edit tapped") self.myArray.add(indexPath.row) }) editAction.backgroundColor = UIColor.blue // action two let deleteAction = UITableViewRowAction(style: .default, title: "Delete", handler: { (action, indexPath) in print("Delete tapped") self.myArray.removeObject(at: indexPath.row) self.myTableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic) }) deleteAction.backgroundColor = UIColor.red // action three let shareAction = UITableViewRowAction(style: .default, title: "Share", handler: { (action , indexPath)in print("Share Tapped") }) shareAction.backgroundColor = UIColor .green return [editAction, deleteAction, shareAction] } 
0
Dec 19 '18 at 9:56
source share



All Articles