【问题标题】:TableViewCell "Will NOT" indent in editing mode?TableViewCell“不会”在编辑模式下缩进?
【发布时间】:2013-02-13 21:56:09
【问题描述】:
我正在使用 Xcode(最新版本)构建 iOS6,而在 Interface Builder 中,我现在创建了一个只有几个标签的自定义单元格。我希望标签“缩进”而不是被左侧的删除符号和右侧的“重新排序单元格行”符号覆盖。在 IB 中,我注意到一个复选框被选中,说 Indent While Editing 它也设置为 10,并且由于某种原因这仍然不起作用?我们现在是否也必须将“内容视图”拖到画布上?我以为那是开箱即用的。即使在 IB 中也是一个选项,我也无法改变我的单元格高度。这可能是因为新的自动布局系统吗?我知道我有一个单元格背景,因为当我创建它们时,我会非常轻微地改变每个其他单元格的颜色。我还在 IB 内将选择颜色更改为灰色,这也有效。
我已经四处搜索,每个人都在问“如何阻止它缩进”我希望它发生而不是它。
有什么想法吗?
【问题讨论】:
标签:
uitableview
ios6
autolayout
【解决方案1】:
在使用自动布局时,单元格缩进不能开箱即用。请参阅this 问题。
【解决方案2】:
问题似乎是 AutoLayout 中的一个错误,其中系统生成的左侧水平约束绑定在标签和单元格的视图之间,而不是单元格的 contentView。这可能已在 XCode 5 中修复。
很多人似乎都说关闭 AutoLayout 是解决办法,但这样一来,您就失去了 AutoLayout 的所有好处,只是为了修复一个自定义单元格的缩进。它实际上很容易用四行代码修复(和两个IBOutlets,你可能已经拥有其中一个);
为您的标签和左侧水平约束创建一个 IBOutlet,方法是在 Interface Builder 中按住 CTRL 键将它们拖到 UITableViewCell 子类的头文件中,并将它们命名为“label”和“leftHorizontalConstraint”(匹配下面的代码,或使用您自己的名字并更改代码。
在UITableViewCell 的子类中覆盖awakeFromNib 并添加此代码;
// Remove the constraint that you can't delete in IB (XCode 4)
[self removeConstraint:self.leftHorizontalConstraint];
//Create a dictionary of variable name bindings
NSDictionary *labelDict = NSDictionaryOfVariableBindings(_label);
//Create a horizontal constraint for the label, 20 points from the left edge of its container
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-20-[_label]" options:0 metrics:nil views:labelDict];
//Add the constraint to the containerView
[self.contentView addConstraints:constraints];
当然,如果 IB 首先生成 label 和 containerView 之间的约束,那会容易得多。我在 XCode 5 中修复了这个问题,但我还没有测试过。您至少应该能够使用 XCode 5 手动删除约束,因为 IB 现在允许您删除系统生成的约束。