カスタムUITableViewCellを備えたグループ化されたスタイルのUITableViewControllerがあります。UITableViewCell には、ストーリーボード (プロトタイプ セル) で定義された NSLayoutConstraints があり、UIImageView のサイズと位置を指定します。これらの NSLayoutConstraints は、UITableViewCell サブクラスのプロパティにリンクされています。
サブクラス化された UITableViewCell の -(void)layoutSubviews メソッドで、使用しようとしています
self.topSpacingConstraint.constant = 0;
セルごとに配置を変更します。
ただし、そのコード行はすべてのセルの制約を調整します。理由がわかりません。単一のセルに制約を設定する方法もわかりません。
アップデート
-(void)layoutSubviews
UITableViewCell サブクラスのメソッドの完全なコードを次に示します。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)layoutSubviews
。awakeFromNib
UITableViewCell サブクラスの新しい制約を削除して作成するコードを追加しました。
- (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];
}