2013-07-12 122 views
13

我想取代单元格的默认编辑模式行为。UITableViewCell自定义编辑视图

我不想要红色的圆线与线左辅助视图出现。

一旦进入编辑模式,我需要它将内容视图左移&显示我的删除按钮。

我有什么到目前为止(自定义的UITableViewCell)覆盖:

-(void) setEditing:(BOOL)editing animated:(BOOL)animated 
{ 
    /* don't call super */ 
// [super setEditing:editing animated:animated]; 
    _isEditing = editing; 

    CGFloat newContentViewX = 0.0f; 
    UIColor *newDeleteButtonColor = [UIColor clearColor]; 

    if (_isEditing) 
    { 
     newContentViewX = -40.0f; 
     newDeleteButtonColor = [UIColor redColor]; 
    } 

    if (animated) 
    { 
     [UIView animateWithDuration:0.5f 
           delay:0.0f 
          options:UIViewAnimationOptionCurveEaseInOut 
         animations:^ 
     { 
      self.contentView.x = newContentViewX; //change frame.origin.x 
      _deleteButton.backgroundColor = newDeleteButtonColor; 
     } 
         completion:nil]; 
    } 
    else 
    { 
     self.contentView.x = newContentViewX; //change frame.origin.x 
     _deleteButton.backgroundColor = newDeleteButtonColor; 
    } 
} 

-(BOOL) editing 
{ 
    return _isEditing; 
} 

&这就是结果: setEditing:NO setEditing:YES

上面的代码的伟大工程!在开始滚动&之前,contentview会被重置。回到第一张图片。编辑标志不会保留我的contentview框架更改。

我已经加入这一行:

[cell setEditing:_tableView.isEditing animated:NO]; 
中的cellForRowAtIndexPath &

虽然它调用&设置编辑模式正确我的内容查看仍然在原来的位置&不更新

短的YouTube视频说明问题: Youtube link

其他人有这个问题吗?

+5

您应该只为制作YouTube视频+1。现在很容易理解。 –

回答

2

你的问题是,UITableView是“帮助”设置与你从cellForRowAtIndexPath返回的单元格相应的状态布局。

处理这个问题的最简单方法是在您的单元类中覆盖-layoutSubviews。

- (void)layoutSubviews 
{ 
    if (self.editing) 
    { 
    CGRect bounds = self.bounds; 
    // do your custom layout 
    } 
    else 
    [super layoutSubviews]; 
} 

这应该得到很多东西排序。

3

不要篡改内容视图框架。只需创建您的按钮并将其设置为editingAccessoryView,演示文稿将为您完成。

+0

是的,除了你仍然得到左边的( - )圆形按钮并将内容视图右移 – Ryan

+1

在'tableView:editingStyleForRowAtIndexPath:'返回'UITableViewCellEditingStyleNone'。您可能还想定制单元格被设置为编辑模式的方式和时间(用于滑动删除)。 – Wain

1

看来你正在遭受UITableView如何将setEditing消息传递给其子单元格的副作用。该文档声明电视将此消息发送给VISIBLE单元(仅)。因此,当一个新的/出列的单元格变得可见时,它没有setEditing消息,因此_editting = NO。因此,您需要在tableView:cellForRowAtIndexPath:方法中测试并设置单元格的_editting = YES,那么您应该使用显示的删除按钮来获取滚动行为。