在向左滑动时在UITableViewCell中自定义编辑视图。 Objective-C或Swift

如何在iOS7中使用Objective-C进行自定义编辑视图,例如Evernote或Apple Reminders应用程序,同时向左滑动。 我试图设置一个自定义的editingAccessoryView,但是这不起作用。

Evernote编辑视图:

在这里输入图像描述 提醒编辑视图:

在这里输入图像描述

我目前的代码是

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

我试图解决这个问题:(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; } 

和以下一样:(UITableViewCell)

 - (void)willTransitionToState:(UITableViewCellStateMask)state; - (void)setEditing:(BOOL)editing animated:(BOOL)animated; - (UIView*)editingAccessoryView; 

只需复制粘贴下面的代码!

 -(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]; } 

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] } 

注意:对于iOS 8以上

请参阅此链接: https : //github.com/TeehanLax/UITableViewCell-Swipe-for-Options

并用多个button自定义您的uitableviewcell。

  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]; 
  • 我已经实现了这个代码与我的应用得到了这样的结果。 您可以在滑动单元格中添加多个button。

    这里是实现屏幕截图

    在这里输入图像描述 滑动单元格3button后出现“更多”,“共享”,“删除”。

您可以使用UITableViewRowActionbackgroundColor来设置自定义图像或视图。 诀窍是使用UIColor(patternImage:)

基本上UITableViewRowAction区域的宽度是由它的标题决定的,所以你可以find一个确切的标题长度(或者空格),并用patternImage设置图像的确切大小。

为了实现这个,我做了一个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! } 

并用空格和精确的长度来创build一个string,

 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 } 

现在,你可以创buildUITableViewRowAction

 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] } 

结果将如下所示。

在这里输入图像描述

另一种方法是导入具有要用作字体的图像的自定义字体,并使用UIButton.appearance 。 但是,这将影响其他button,除非您手动设置其他button的字体。

你可以试试这个,

 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] } 
 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] } 

上面的代码演示了如何在行上滑动时创build自定义button。

如果您只想在使用滑动操作时使用文本,则可以使用iOS默认滑动操作,但是如果需要图像和文本,则必须对其进行自定义。 我find了一个很好的教程和示例,可以解决这个问题。

试试这个知识库来获得自定义的滑动单元格。 你可以在这里添加多个选项。

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

https://github.com/pradeep7may/PKSwipeTableViewCell

在这里输入图像描述

正如我所想,使用基于UIGestureRecognizer的单元格不是最好的方法。

首先,你不会有任何select使用CoreGraphics。

完美的解决scheme,将UIResponder或一个UIGestureRecognizer整个表视图。 不是每个UITableViewCell 。 它会让你的应用程序卡住。

在表视图中的自定义单元格上创build视图,并将PanGestureRecognizer应用于单元格上的视图。将自定义单元格中的button添加到自定义单元格中,然后在自定义单元格上滑动视图时,自定义单元格上的button将会显示。

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

并在方法中处理视图上的平移

  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; } ]; } }