在向左滑动时在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后出现“更多”,“共享”,“删除”。
您可以使用UITableViewRowAction
的backgroundColor
来设置自定义图像或视图。 诀窍是使用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; } ]; } }
- 如何初始化iOS 5故事板中的自定义原型样式表单元格?
- 在UIButton缩放图像到AspectFit?
- 在子视图使用自动布局dynamic更改后调整superview的大小
- iPhone上的纵向UISplitViewController显示细节VC而不是主
- 设置“xcode-select -switch”后,Xcode停止工作
- 无法使用标识符Cell出队 – 必须为该标识符注册一个nib或一个类,或者在故事板中连接一个原型单元格
- 在iOS平移和滑动有什么区别?
- 如何从iPhone访问SOAP服务
- dequeueReusableCellWithIdentifier:forIndexPath:get使用的indexPath在哪里?