web-dev-qa-db-ja.com

サブクラス化されたuitableviewcellの自動レイアウト制約をどこで作成しますか?

作成している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];
}

このコードをどこに置くべきか誰か教えてもらえますか?確かに、レイアウトが発生するたびに重複する制約を作成しています。

ありがとう

16
Ty Newton

次のような制約を更新する必要があります。

-(void)updateConstraints{
 // add your constraints if not already there
 [super updateConstraints];
}

ビューをスーパービューに追加した後、それらの使用を開始するには[self setNeedsUpdateConstraints]を呼び出す必要があります。そうすることで、レンダリングランタイムは適切なタイミングでupdateConstraintsを呼び出します。

31
Adrian