我制作了一个自定义的UITableViewCell并正确完成(将所有内容添加到contentView
,并覆盖layoutSubviews
,以便我的子视图相对于contentView.bounds
)。
当用户按下“编辑”按钮时,表格会缩进以留出红色删除符号的空间。这很好,但默认的缩进量太多,并且破坏了我的自定义单元格的外观。如何减少压痕量? setIndentationLevel
和tableView:IndentationLevelForRowAtIndexPath
似乎没有做任何事情。
(有人提出类似的问题here,但它从未解决过。)
答案 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)
现在唯一的事情就是当你滑动删除然后取消(点击屏幕上的其他地方)时,单元格突然向左跳,然后在删除按钮消失时向后滑动
我遇到了同样的问题。我不确定它为什么会发生,但在设置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];