0

カスタムUITableViewCellを備えたグループ化されたスタイルのUITableViewControllerがあります。UITableViewCell には、ストーリーボード (プロトタイプ セル) で定義された NSLayoutConstraints があり、UIImageView のサイズと位置を指定します。これらの NSLayoutConstraints は、UITableViewCell サブクラスのプロパティにリンクされています。

サブクラス化された UITableViewCell の -(void)layoutSubviews メソッドで、使用しようとしています

self.topSpacingConstraint.constant = 0;

セルごとに配置を変更します。

ただし、そのコード行はすべてのセルの制約を調整します。理由がわかりません。単一のセルに制約を設定する方法もわかりません。

アップデート

-(void)layoutSubviewsUITableViewCell サブクラスのメソッドの完全なコードを次に示します。self.topCellおよびself.bottomCellは、セルの構成中に UITableViewController によって設定されるプロパティです。これらの値に基づいて、セルごとに画像の AutoLayout 間隔を更新しようとしています。

- (void)layoutSubviews
{
    [super layoutSubviews];

    UIImage *mask;

    if (self.topCell && self.bottomCell) {
        self.imageSpacingTopConstraint.constant = 1;
        self.imageSpacingBottomConstraint.constant = 2;
        mask = MTDContextCreateRoundedMask(self.wineImage.bounds, 6.0, 0.0, 6.0, 0.0);
    } else if (self.topCell) {
        self.imageSpacingTopConstraint.constant = 1;
        self.imageSpacingBottomConstraint.constant = 0;
        mask = MTDContextCreateRoundedMask(self.wineImage.bounds, 6.0, 0.0, 0.0, 0.0);
    } else if (self.bottomCell) {
        self.imageSpacingTopConstraint.constant = 0;
        self.imageSpacingBottomConstraint.constant = 2;
        mask = MTDContextCreateRoundedMask(self.wineImage.bounds, 0.0, 0.0, 6.0, 0.0);
    } else {
        self.imageSpacingTopConstraint.constant = 0;
        self.imageSpacingBottomConstraint.constant = 0;
        mask = MTDContextCreateRoundedMask(self.wineImage.bounds, 0.0, 0.0, 0.0, 0.0);
    }

    CALayer *layerMask = [CALayer layer];
    layerMask.frame = self.wineImage.bounds;
    layerMask.contents = (id)mask.CGImage;
    self.wineImage.layer.mask = layerMask;
}

これを行う必要があるのは、グループ化されたスタイルのテーブルのセルの高さが一貫していないためです。上部と下部のセルは「中央」のセルよりも 1 ポイント高くなっていますが、テーブル内の 1 つのセルは 2 ポイント高くなっています。すべてのセルの画像に同じ間隔制約を使用すると、画像によって一部のセルのセル境界が部分的に不明瞭になったり、画像と他のセルの境界の間に空白が残ったりします。

誰かがこれを攻撃する簡単な方法を考えることができれば、私はそれを感謝します.

解決

以下のマークされたソリューションに従って、画像の間隔の制約を削除してから、画像と cell.contentView の間に新しい制約を作成するとうまくいきました。メソッドから制約を調整するコードを削除しました-(void)layoutSubviewsawakeFromNibUITableViewCell サブクラスの新しい制約を削除して作成するコードを追加しました。

- (void)awakeFromNib
{
    [super awakeFromNib];

    // Since Xcode 4.6.3 creates constrain relationships between the image and the cell, we need to delete and then recreate between the image and the cell.contentView

    [self removeConstraint:self.imageSpacingTopConstraint];
    [self removeConstraint:self.imageSpacingBottomConstraint];

    self.imageSpacingTopConstraint = [NSLayoutConstraint constraintWithItem:self.wineImage attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0];
    self.imageSpacingBottomConstraint = [NSLayoutConstraint constraintWithItem:self.wineImage attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0];

    [self addConstraint:self.imageSpacingTopConstraint];
    [self addConstraint:self.imageSpacingBottomConstraint];
}
4

2 に答える 2

0

コードに条件はありません。したがって、すべてのセルが変更されます。

コードを追加したので、次の 2 つの理由が考えられます。

  1. topCell がそうでない場合、if ステートメントは 0 定数を生成しませんnil。それは完全に論理的ではないようです。

  2. if ステートメントの下のレイヤー セクションは、予想されるレイアウトを再び変更する可能性があります。

于 2013-06-30T07:52:44.493 に答える