3

プログラムで実装されたカスタム UITableViewCell で iOS 6 の新しい自動レイアウト機能を使用しようとしています。addConstraint 呼び出しを追加しましたが、スクロールするまでは最初は適切に機能します。スクロール後にセルに戻ると、レイアウトが破棄されます。ゴミ箱に入れられたということは、フィールド間の余白がすべて間違っていることを意味します (大きすぎて、セルのサイズをはるかに超えています)。これは dequeueReusableCellWithIdentifier メソッドと関係があると推測していますが、セル内のフィールドを再初期化する必要があるのと同じように、「汚れた」セルが残っていますが、適切にレンダリングするためにそれをなだめるために何もできないようですまた。セルを返す前に [self.contentView updateConstraints] を呼び出してみました。制約を破棄して再作成しようとしました。うまくいかないだけでなく、ただし、layoutSubviews で試行すると、ある種の無限ループでフリーズします。何か案は?

制約を設定するコードは次のとおりです。initWithStyle:reuseIdentifier にあります。

[self.completedLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.nextSetHeaderLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.nextSetDetailLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.youWillLearnHeaderLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.youWillLearnDetailLabel setTranslatesAutoresizingMaskIntoConstraints:NO];

[self.contentView removeConstraints:[self.contentView constraints]];

NSDictionary *views = NSDictionaryOfVariableBindings(_completedLabel, _nextSetHeaderLabel, _nextSetDetailLabel, _youWillLearnHeaderLabel, _youWillLearnDetailLabel);

[self.contentView addConstraints:
 [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-5-[_completedLabel]-5-|"
                                         options:0
                                         metrics:nil
                                           views:views]];
[self.contentView addConstraints:
 [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-5-[_nextSetHeaderLabel]-5-|"
                                         options:0
                                         metrics:nil
                                           views:views]];

[self.contentView addConstraints:
 [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-5-[_nextSetDetailLabel]-5-|"
                                         options:0
                                         metrics:nil
                                           views:views]];

[self.contentView addConstraints:
 [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-5-[_youWillLearnHeaderLabel]-5-|"
                                         options:0
                                         metrics:nil
                                           views:views]];

[self.contentView addConstraints:
 [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-5-[_youWillLearnDetailLabel]-4-|"
                                         options:0
                                         metrics:nil
                                           views:views]];

[self.contentView addConstraints:
 [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-5-[_completedLabel]-12-[_nextSetHeaderLabel]-0-[_nextSetDetailLabel]-12-[_youWillLearnHeaderLabel]-0-[_youWillLearnDetailLabel(>=20)]-1-|"
                                         options:0
                                         metrics:nil
                                           views:views]];
4

2 に答える 2

1

私もこの問題に遭遇しました。セルをデキューしていない場合、スクロール、回転など、すべてが機能しているように見えました。ただし、セルをデキューすると、レイアウトがめちゃくちゃになり始めました。これを機能させる唯一の方法は、セルの prepareForReuse メソッドをオーバーライドすることでした。この方法では、

    1. すべてのカスタム サブビュー
    を削除します 2. それらのサブビューに関連付けられているすべての制約を contentView から削除し
    ます 3. サブビューと制約を再度追加します
-(void) prepareForReuse
{
    [self removeCustomSubviewsFromContentView];
    [self.contentView removeConstraints:self.constraints] //self.constraits holds all the added constraints
    [self setupSubviewsInContentView];
    [self addConstraintsToContentView];
}

これを行うためのより良い方法があれば、私も学びたいです:)デキューの利点は、tableViewがメモリ内に多数のセルを保持する必要がないことだと思います-しかし、この方法では、デキューするたびに基本的にセルをセットアップするというコストがかかります。

于 2013-10-22T09:59:46.497 に答える
0

同様の問題がありました。誰かが興味を持っている場合に備えて、解決策を見つけました。この質問を参照してください

私がやったこと:

- (void)awakeFromNib
{
    [super awakeFromNib];

    for (NSLayoutConstraint *cellConstraint in self.constraints)
    {
        [self removeConstraint:cellConstraint];

        id firstItem = cellConstraint.firstItem == self ? self.contentView : cellConstraint.firstItem;
        id seccondItem = cellConstraint.secondItem == self ? self.contentView : cellConstraint.secondItem;

        NSLayoutConstraint* contentViewConstraint = [NSLayoutConstraint constraintWithItem:firstItem
                                                                                 attribute:cellConstraint.firstAttribute
                                                                                 relatedBy:cellConstraint.relation
                                                                                    toItem:seccondItem
                                                                                 attribute:cellConstraint.secondAttribute
                                                                                multiplier:cellConstraint.multiplier
                                                                                  constant:cellConstraint.constant];

        [self.contentView addConstraint:contentViewConstraint];
    }
}
于 2013-06-20T12:25:34.143 に答える