我有一个带有自定义类的原型单元格,我想在单元格第一次初始化时在单元格上绘制一些额外的层,而不是每次重用单元格时。在过去,我会通过实现 awakeFromNib 来做到这一点。我希望能够访问单元格中视图的框架,以便可以在我的新图层图中使用它们的尺寸,但是对于 iOS6,子视图在 awakeFromNib 方法中的框架宽度/高度都为 0。我怀疑这与我还不太了解的新约束布局有关。
- (void)awakeFromNib {
[super awakeFromNib];
// We only want to draw this dotted line once
CGPoint start = CGPointZero;
CGPoint end = CGPointMake(self.horizontalSeparator.frame.size.width, 0);
// Category that creates a layer with a dotted line and adds it to the view.
[self.horizontalSeparator addDottedLine:start to:end];
}
在 awakeFromNib 中,horizontalSeparator.frame = (0 100; 0 0)。如何为每个单元格绘制一次此虚线图层并使用现有水平分隔符视图的宽度来确定线的长度?
更新
我发现我可以使用超级视图上的约束来计算子视图上的尺寸,但我仍然希望有人可以为我指出一个更好的解决方案,它不会对约束配置做出假设。
for (NSLayoutConstraint *constraint in self.constraints) {
if (// Find a constraint for the horizontalSeparator
(constraint.firstItem == self.horizontalSeparator
|| constraint.secondItem == self.horizontalSeparator)
&& // Make sure it affects the leading or trailing edge.
(constraint.firstAttribute == NSLayoutAttributeLeading
|| constraint.firstAttribute == NSLayoutAttributeTrailing)) {
CGFloat margin = constraint.constant;
CGPoint start = CGPointZero;
CGPoint end = CGPointMake(self.frame.size.width - (2 * margin), 0);
[self.horizontalSeparator addDottedLine:start to:end];
_isInitialized = YES;
break;
}
}