16

作成中の uitableviewcell サブクラスに autolayout を使用しようとしています。レイアウト制約作成コードを配置する方法についてアドバイスをいただければ幸いです。私は周りを検索しており、見つけたすべての情報は、viewDidLoad メソッドでサブビューを追加した後に制約を追加することについて語っています。私の知る限り、viewDidLoad は uitableviewcell サブクラスのオプションではありません。

インターフェイスビルダーを使用してカスタムセルを作成し、コードに動的に割り当てています。特別なことは何もありません... uitableviewcell をサブクラス化して、セルにカスタム uiview を追加できるようにします。繰り返しますが、特に地球を粉砕するものは何もありません...インターフェースビルダーでセルに追加したラベルに対してカスタム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];
}

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

ありがとう

4

1 に答える 1

31

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

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

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

于 2013-04-09T06:44:04.293 に答える