セルが再利用されるたびにではなく、セルが最初に初期化されるときに、セルにいくつかの余分なレイヤーを描画したいカスタムクラスを持つプロトタイプセルがあります。以前は、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)。この点線レイヤーをセルごとに 1 回描画し、既存の horizontalSeparator ビューの幅を使用して線の長さを決定するにはどうすればよいですか?
アップデート
スーパービューの制約を使用してサブビューの寸法を把握できることがわかりましたが、制約の構成について仮定しないより良い解決策を誰かが教えてくれることを望んでいます。
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;
}
}