如何在编辑时更改自定义UITableViewCell上的缩进量?

时间:2011-04-19 07:48:16

标签: iphone cocoa-touch uitableview

我制作了一个自定义的UITableViewCell并正确完成(将所有内容添加到contentView,并覆盖layoutSubviews,以便我的子视图相对于contentView.bounds)。

当用户按下“编辑”按钮时,表格会缩进以留出红色删除符号的空间。这很好,但默认的缩进量太多,并且破坏了我的自定义单元格的外观。如何减少压痕量? setIndentationLeveltableView:IndentationLevelForRowAtIndexPath似乎没有做任何事情。

(有人提出类似的问题here,但它从未解决过。)

2 个答案:

答案 0 :(得分:15)

您必须覆盖layoutSubviews并执行以下操作。并且不要忘记将缩进级别设置为大于0的值。对于自定义单元格,默认情况下不应用缩进级别。

为避免单次滑动缩进以删除手势,您必须执行更多工作。有一个状态反映了单元格的编辑状态。它不是公共的,但可以使用- (void)willTransitionToState:(UITableViewCellStateMask)aState访问,因此将其存储在属性中可以完成layoutViews的工作。

Apple的 willTransitionToState:

的文档
  

请注意,当用户滑动单元格时   要删除它,单元格将转换为   由国家确定的国家   UITableViewCellStateShowingDeleteConfirmationMask   不变但是   UITableViewCellStateShowingEditControlMask   没有设定。

标题文件

int state;

...

@property (nonatomic) int state;

...

单元格实施

@synthesize state;

...

- (void)layoutSubviews
{
    [super layoutSubviews];

    self.contentView.frame = CGRectMake(0,                                          
                                        self.contentView.frame.origin.y,
                                        self.contentView.frame.size.width, 
                                        self.contentView.frame.size.height);

    if (self.editing
        && ((state & UITableViewCellStateShowingEditControlMask)
        && !(state & UITableViewCellStateShowingDeleteConfirmationMask)) || 
            ((state & UITableViewCellStateShowingEditControlMask)
         && (state & UITableViewCellStateShowingDeleteConfirmationMask))) 
    {
        float indentPoints = self.indentationLevel * self.indentationWidth;

        self.contentView.frame = CGRectMake(indentPoints,
                                            self.contentView.frame.origin.y,
                                            self.contentView.frame.size.width - indentPoints, 
                                            self.contentView.frame.size.height);    
    }
}

- (void)willTransitionToState:(UITableViewCellStateMask)aState
{
    [super willTransitionToState:aState];
    self.state = aState;
}

答案 1 :(得分:1)

除了Rec Levy指出的问题外,Nick Weaver的更新答案很有效:

  

现在唯一的事情就是当你滑动删除然后取消(点击屏幕上的其他地方)时,单元格突然向左跳,然后在删除按钮消失时向后滑动

我遇到了同样的问题。我不确定它为什么会发生,但在设置contentView框架时禁用动画会解决它。

...
[UIView setAnimationsEnabled:NO];
self.contentView.frame = CGRectMake(indentPoints,
                                        self.contentView.frame.origin.y,
                                        self.contentView.frame.size.width - indentPoints, 
                                        self.contentView.frame.size.height);
[UIView setAnimationsEnabled:YES];