缩进不适用于Custom UITableViewCell

时间:2012-10-11 06:04:24

标签: objective-c ios uitableview indentation

我的项目中有一个简单的Custom UITableViewCell,只是在表格中添加了一个Edit操作。一切似乎都很好,但编辑时缩进不起作用,编辑图标与内容重叠。 (更不用说删除按钮)

Indentation not working in custom cell
自定义单元格是在界面构建器中创建的,像往常一样使用标准约束,我已经尝试在类中替换layoutSubviews方法,如其他地方所提到的那样没有运气,如下所示;

(void)layoutSubviews
{
[super layoutSubviews];
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
                                    );
}

我还确认子视图实际上在contentView中,并且在视图和代码中一切似乎都很好。

Cell还以编程方式设置了indentationLevel / Width,并将掩码自动调整为自动宽度。

作为最后的手段,我可​​以以编程方式创建UITableViewCell,但不认为它可以提供帮助。

根据推荐,我还确保将单元格内容的约束修复为超级视图。

Fixed Margins on the left

在Code中手动设置de autoResizingMasks没有运气

- 编辑:

我已经手动将contentView的背景颜色设置为黑色,并发现它在编辑模式下正确缩进,即使没有覆盖“layoutSubviews”。事实上,用它做得更好。

enter image description here

但是,正如您所看到的,内容不会缩进。最初我认为单元格的内容(UIImage)不是contentView的子视图,但是对子视图进行了记录,显示它们是。

NSLog(@"%@", self.contentView.subviews);

"<UIImageView: 0xa477030; frame = (23 7; 31 50); autoresize = TM+BM; userInteractionEnabled = NO; layer = <CALayer: 0xa477090>>"

我完全不知道为什么会一直发生这种情况。必须是一些与iOS 6新约束相关的隐藏约束。

4 个答案:

答案 0 :(得分:16)

缩进与进入编辑模式时调整内容视图不同。

你是对的,这看起来很简单,通常几乎可以直接开箱即用。通常,您需要更改的唯一内容是添加到单元格的组件的自动调整掩码。左边的内容应该有一个固定的左边距,右边的内容应该有一个固定的右边距。

当单元格进入编辑模式时,将调整内容视图的大小以便为编辑附件留出空间。如果您的内容具有这些调整大小的掩码,它将与此一起移动。上面的layoutSubviews方法很可能通过将内容视图设置回全宽来撤消所有这些,因为您正在使用缩进错误 - 尽管我无法从问题中的信息中确定这一点。

<强>更新

这是UITableViewCells中存在约束的问题(bug?)。您可以通过选择故事板/界面构建器屏幕中的“文件”选项卡返回自动调整掩码(如果您想在其他地方使用约束,请为单元使用独立的笔尖)并取消选中“使用Autolayout”:

enter image description here

这可以正确排列您的手机内容。

答案 1 :(得分:0)

您可以尝试这些功能并解决它们:

- (void)willTransitionToState:(UITableViewCellStateMask)state {
 [super willTransitionToState:state];

 if ((state & UITableViewCellStateEditingMask) || (state & UITableViewCellStateShowingDeleteConfirmationMask)) {
  [UIView beginAnimations:nil context:NULL];
  [UIView setAnimationDuration:0.3];
  label.alpha = 0.0;

// LayoutSubview代码       [UIView commitAnimations];      }     }

- (void)didTransitionToState:(UITableViewCellStateMask)state {
 [super didTransitionToState:state];

 if (!(state & UITableViewCellStateEditingMask) && !(state & UITableViewCellStateShowingDeleteConfirmationMask)) {
  [UIView beginAnimations:nil context:NULL];
  [UIView setAnimationDuration:0.5];
  label.alpha = 1.0;
// LayoutSubview code
  [UIView commitAnimations];
 }
}

答案 2 :(得分:0)

取消选中“使用Autolayouts”为我做了诀窍。

答案 3 :(得分:0)

将tableView边缘插入设置为零

[self.tableView setSeparatorInset:UIEdgeInsetsZero];