iOS 8での自動サイズ変更UITableViewCell


Answers

私はこの問題に直面しました。

他の多くのStackoverflow投稿から、

self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;

それは最初は私にとってはうまくいかなかった。 私はまた私がする必要があることを発見した

self.frame = CGRectMake(0, 0, self.frame.size.width, 50);

私のカスタムセルのinitメソッドは、次のようになります。

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    if(self)
    {
        [self initViews];
        [self initConstraints];
    }

    return self;
}

私は私の "initViews"メソッドにコードを入れました:

-(void)initViews
{
    ...

    // fixes an iOS 8 issue with UIViewEncapsulated height 44 bug
    self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
    self.frame = CGRectMake(0, 0, self.frame.size.width, 50);
}

問題は消えて、私のセルも正しいように見えます。

これはあなたのために働きますか?

Question

私は、複数行のラベルを含むUITableViewCellサブクラスを持っていて、セルはそのラベルの内容に基づいて動的にサイズを変更したいと思います。 私は、iOS 8がAutoLayoutの制約に基づいて自動サイジングセルを導入したことを認識しています。これについてはすでにいくつかの例がありますが、この動作を正しく実装するにはまだ問題があります。

ここに私のupdateConstraints実装があります:

- (void)updateConstraints {
    [super updateConstraints];

    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[_nameLabel(==20)]-10-[_tweetLabel]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_nameLabel, _tweetLabel)]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[_avatarView]-10-[_nameLabel]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView, _nameLabel)]];

    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_nameLabel]-10-[_tweetLabel]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_nameLabel, _tweetLabel)]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[_avatarView]-10-[_tweetLabel]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView, _tweetLabel)]];

    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[_avatarView(==45)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView)]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[_avatarView(==45)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView)]];
}

テーブルビューのコントローラでは、行の高さをUITableViewAutomaticDimensionに設定します(推定行の高さも設定します)。 実行時に、一連の自動レイアウトエラーが発生し、すべてのテーブルビューセルがほぼ完全に重なって表示されます。

自動レイアウトの競合は、次の制約の間にあります。

  • V:|-(10)-[_nameLabel]
  • V:[_nameLabel(20)]
  • V:[_nameLabel]-(10)-[_tweetLabel]
  • V:[_tweetLabel]-(10)-|
  • V:[cell(44)]

私は最後の制約である「UIView-Encapsulated-Layout-Height」(44の高さを強制する)が問題の原因だと思っていますが、どこから来たのかは分かりませんので、誰かが問題。