作成しているuitableviewcellサブクラスに自動レイアウトを使用しようとしています。レイアウト制約作成コードを配置する方法についてアドバイスをいただければ幸いです。私は周りを検索していて、見つけたすべての情報は、viewDidLoadメソッドにサブビューを追加した後に制約を追加することについて話します。私の知る限り、viewDidLoadはuitableviewcellサブクラスのオプションではありません。
Interface Builderを使用してカスタムセルを作成し、コードに動的に割り当てています。特別なことは何もありません...私はuitableviewcellをサブクラス化して、カスタムuiviewをセルに追加できるようにします。繰り返しになりますが、特に地球を破壊することはありません... Interface Builderのセルに追加したラベルに対して、カスタムuiviewを配置しようとすると、問題が発生します。
これは、カスタムuiviewを作成し、それをセルのコンテンツビューに追加するためのコードです。
- (id)initWithCoder:(NSCoder *)decoder
{
if ((self = [super initWithCoder:decoder]))
{
[self initSelf];
}
return self;
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]))
{
[self initSelf];
}
return self;
}
- (void) initSelf
{
// Initialization code
_badgeLabel = @"";
if (!_customBadge)
{
_customBadge = [CustomBadge customBadgeWithString:self.badgeLabel];
}
// hide the badge until needed
self.customBadge.hidden = YES;
// add badge to the cell view hierarchy
[self.customBadge setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.customBadge setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisHorizontal];
[self.customBadge setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisVertical];
[self.contentView addSubview:self.customBadge];
}
InitSelfの最後に制約コードを配置しても、何も起こりません。 _customBadgeの位置はデフォルトのままです。 layoutSubviewsに制約コードを配置すると、配置が適用されます。しかし、私はそれが間違った場所であるとかなり確信しています。コードは次のとおりです。
- (void) layoutSubviews
{
[self.contentView addConstraint:[NSLayoutConstraint
constraintWithItem:self.customBadge
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.competence
attribute:NSLayoutAttributeRight
multiplier:1.0
constant:-14.0]];
[self.contentView addConstraint:[NSLayoutConstraint
constraintWithItem:self.customBadge
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.competence
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:0.0]];
[super layoutSubviews];
}
このコードをどこに置くべきか誰か教えてもらえますか?確かに、レイアウトが発生するたびに重複する制約を作成しています。
ありがとう
次のような制約を更新する必要があります。
-(void)updateConstraints{
// add your constraints if not already there
[super updateConstraints];
}
ビューをスーパービューに追加した後、それらの使用を開始するには[self setNeedsUpdateConstraints]
を呼び出す必要があります。そうすることで、レンダリングランタイムは適切なタイミングでupdateConstraints
を呼び出します。