3

UITableViewCell 内の UIImage の幅を動的に調整したいのですが、ストーリーボードを使用して UITableViewCell を設計しています。ラベルと画像を追加しただけで、プロパティが正しく更新され、値を読み込んでいますラベルの幅を正しい値であることを示します。画像については、繰り返したい背景画像を読み込んでいますが、画像を上下にスクロールすると、最初は幅が更新されません。期待どおりに表示されます。これが cellForRowAtIndexPath のコードです。また、コードを willDisplayCell メソッドに配置しようとしましたが、同じ結果です

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"mycustomcell"];
    int r = [[data objectAtIndex:indexPath.row] intValue];
    UIImageView *img = (UIImageView *)[cell viewWithTag:2];
    img.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"some_img" ofType:@"png"]]];
    CGRect frame = img.frame;
    frame.size.width = r*16;
    img.frame = frame;

    int n = img.frame.size.width;
    UILabel *label = (UILabel *)[cell viewWithTag:1];
    label.text = [NSString stringWithFormat:@"custom %d", n];
    [cell setNeedsDisplay];
    return cell;
}

スクロールした後に機能するので、これを最初に機能させたいだけですか?

4

2 に答える 2

7

テーブルビュー セルのコンテンツの動的なサイズ変更は、よく知られている問題です。厄介な回避策がありますが、適切な解決策は、autolayout を使用しているかどうかによって異なると思います。

  • 自動レイアウトを使用する場合は、セルの画像ビューに幅の制約があることを確認してから、制約の を変更できますconstant

    for (NSLayoutConstraint *constraint in img.constraints)
    {
        if (constraint.firstAttribute == NSLayoutAttributeWidth)
            constraint.constant = r*16;
    }
    

    率直に言って、カスタムUITableViewCellサブクラスを使用IBOutletし、幅の制約 (例: imageWidthConstraint) を使用したいと思います。これにより、適切な制約を見つけるために制約を列挙する必要がなくなります。次のことが簡単にできます。

    cell.imageWidthConstraint.constant = r*16;
    
  • 自動レイアウトを使用しない場合は、 をサブクラスUITableViewCell化し、それをセル プロトタイプの基本クラスに使用してから、 をオーバーライドlayoutSubviewsし、そこで画像ビューのサイズを変更する必要があります。UITableViewCell の imageView の境界の変更を参照してください。

どちらのアプローチを採用するかに関係なく、UITableViewCellサブクラスを使用するとviewForTagコンストラクトを使用する必要がなくなるため、ビュー コントローラーのコードがもう少し直感的になります。

于 2013-10-13T22:18:06.067 に答える