在进一步调查(查看单元格的子视图层次结构)中,Interface Builder 确实将子视图放置在单元格中contentView
,但它看起来并不像它。
问题的根本原因是 iOS 6 自动布局。当单元格被置于编辑模式(并缩进)时,contentView
它也被缩进,因此可以推断,contentView
由于在contentView
. 但是,Interface Builder 应用的所有自动布局约束似乎都与UITableViewCell
自身相关,而不是contentView
. 这意味着即使contentView
缩进,其中包含的子视图也不 - 约束负责。
例如,当我将 aUILabel
放入单元格中(并将其放置在距离单元格左侧 10 个点的位置)时,IB 自动应用了约束“水平空间 (10)”。然而,这个约束是相对于UITableViewCell
NOT 的contentView
。这意味着当单元格缩进并contentView
移动时,标签会保持原样,因为它符合从 . 左侧保持 10 个点的约束UITableViewCell
。
不幸的是(据我所知)没有办法从 IB 本身中删除这些 IB 创建的约束,所以这就是我解决问题的方法。
在单元格的子类中,我为该约束UITableViewCell
创建了一个名为. 您还需要一个标签本身,我称之为. 然后我按照以下方式实现了该方法:IBOutlet
cellLabelHSpaceConstraint
IBOutlet
cellLabel
-awakeFromNib
- (void)awakeFromNib {
// -------------------------------------------------------------------
// We need to create our own constraint which is effective against the
// contentView, so the UI elements indent when the cell is put into
// editing mode
// -------------------------------------------------------------------
// Remove the IB added horizontal constraint, as that's effective
// against the cell not the contentView
[self removeConstraint:self.cellLabelHSpaceConstraint];
// Create a dictionary to represent the view being positioned
NSDictionary *labelViewDictionary = NSDictionaryOfVariableBindings(_cellLabel);
// Create the new constraint
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-10-[_cellLabel]" options:0 metrics:nil views:labelViewDictionary];
// Add the constraint against the contentView
[self.contentView addConstraints:constraints];
}
总之,以上将删除 IB 自动添加的水平间距约束(对UITableViewCell
而不是有效contentView
),然后我们定义并将自己的约束添加到contentView
.
在我的例子中,UILabels
单元格中的所有其他元素都是根据的位置定位的,cellLabel
所以当我修复这个元素的约束/定位时,所有其他元素都遵循并正确定位。但是,如果您有更复杂的布局,那么您可能还需要对其他子视图执行此操作。