web-dev-qa-db-ja.com

UICollectionViewセルのサブビューはサイズを変更しません

CollectionViewでは、一部のセルに追加のサブビューまたはレイヤーが必要です。 CollectionViewにはセルのサイズを変更するように指示できるため、すべてのコンテンツを適切にサイズ変更する必要があります。

現在、セルは、imageviewを持つセルを含むペン先から初期化されます。セルのペン先は、カスタムUICollectionViewCellサブクラスにリンクされ、初期化のみを行います。サブビューの自動サイズ変更がチェックされます。

CollectionViewは、派生した値によってセルのサイズを変更し、sizeForItemAtIndexPath:。 FlowLayoutをサブクラス化しましたが、ScrollDirectionInsetsのみを指定しています。

すべてがうまく機能しています。問題:セルにサブビュー/レイヤーを追加して、セルのサイズも正しく変更するにはどうすればよいですか? translatesAutoresizingMaskIntoConstraintsをオフにしてサブビューとレイヤーを追加しようとしましたが、これらは自動的にサイズを変更しません。また、ペン先の代わりにコードフレーム/ビューを使用しようとしました。

私が今得た最高のものはcell.contentView.layer追加するサブレイヤーcellForItemAtIndexPath:;これは、セルのframe.size from sizeForItemAtIndexPath:は、見苦しいだけでなく、さまざまなセルに対してさまざまなサイズのサブレイヤーを作成することになります。

どんな助けも感謝します!

38
ceekay

解決策は、セルxibのAuto Constraintsをオフにし、画像ビューのAutosizeで幅と高さの柔軟な矢印をアクティブにすることでした。

0
ceekay

私は今、同じ問題に遭遇しました。

UICollectionViewFlowLayoutDelegateメソッドを使用して、デバイスとデバイスの向きに応じてセルサイズを設定すると、サイズは適切に計算されますが、サブビューは新しいサイズのセルに合わせてサイズ変更されません。効果は、セルの境界を満たさない小さなサブビューを持つ大きな空白セルで、xibファイル内の現在の値と同じサイズのままです。

awakeFromNibで以下を実行することでこれを解決しました。

- (void)awakeFromNib
{
    [super awakeFromNib];

    self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    self.contentView.translatesAutoresizingMaskIntoConstraints = YES;
}

これを行う前は、contentViewマスクはnilでした。

84
Alfie Hanssen
*override func awakeFromNib() {
    super.awakeFromNib()

    self.contentView.autoresizingMask.insert(.FlexibleHeight)
    self.contentView.autoresizingMask.insert(.FlexibleWidth)
}

これは私のために働いた。

迅速なソリューション*

20
NSCoyote

AutoResizingMaskを有効にする代わりに、たとえばいくつかの制約を手動で設定し、translatesAutoresizingMaskIntoConstraintsをNOのままにする必要がある場合など、可変の高さを持つカスタムUICollectionViewLayoutsの場合、次をセルのlayoutSubviewsに追加できます。

self.contentView.frame = self.bounds;

これは、Xcode 6で問題があったすべてのカスタムコレクションビューレイアウトを修正するのに役立ちました。

Xibsを使用しない別のプロジェクトでは、UICollectionViewCellをサブクラス化し、同じ効果のためにこれを行いました。

#import "CVcell.h"

@implementation CVcell

@synthesize cellImage;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        CGFloat cellSize = self.contentView.bounds.size.width;
        cellImage = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, cellSize, cellSize)];
        [cellImage setClipsToBounds:YES];

        cellImage.translatesAutoresizingMaskIntoConstraints = NO;
        cellImage.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
        [self.contentView addSubview:cellImage];

    }
    return self;
}

@end
4
ceekay

可能な場合は常に自動レイアウトを好みます。しかし、フレームと境界を使用することは、ビューがそのスーパービューだけで簡単に決定される場合の時間節約になります。

UICollectionViewCellの場合、画像をセルフレーム+ self.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

しかし、CollectionViewにさまざまなサイズのセルがあると、物事が台無しになり、画像が別のセルのサイズになることがありました。

それで、私は細胞の境界で作業することになりました-あなたがたは、実際にうまくいきました。

それで、それを試してみませんか?

3
Pedroinpeace

単純な自動レイアウトソリューションは、コンテナビューに制約を設定することです。

そのため、親ビューを持つ画像ビューがある場合、基本的に、サブビュー(画像ビュー)にコンテナビューまでの先頭、末尾、下部、および上部の空間距離を0に維持するように指示します。

Auto layout constraints to resize with parent view

3
jlmendezbonini

@ -Alf Hanssenソリューション( here )は この記事 に従って、私にとっては適切に機能しませんでした:

XIBのセルビューのサイズは50 x 50ポイントです。これは、フローレイアウトで設定されたコレクションビューセルのデフォルトサイズです。 Interface Builderでこれほど小さいセルを操作するのが少し難しい場合でも、デフォルトのサイズを変更しない方が良いでしょう。問題は、自動レイアウトがセルの高さを自動的に調整しようとすると、手動で設定されたサイズが固定されていると見なし、NSAutoresizingMaskLayoutConstraintエラーを生成することです。

UICollectionViewCellを調べたところ、セルとcontentViewの間にビューがあり、そのビューには固有の幅と高さの制約があることがわかりました。 AutoresizingMaskの代わりに、以下のように更新するだけで、うまく機能しているようです。

override func layoutSubviews() {
    contentView.superview?.frame = bounds
    super.layoutSubviews()
}
2
Serluca

同じ問題がありました。 2つのレイアウトを切り替えても、セル内の画像(UIImage)のサイズは変更されませんでした。 xibなしでビルドするMy Cells。また、CollectionViewCustomLayoutごとに2つの異なるセルクラスを使用しました。

これをプログラムで修正しました:

self.autoresizesSubviews = YES;

uICollectionViewCellサブクラスで。

しかし、これは次のようにセルの背景画像として画像を追加することで私にとってはうまくいきました:

cell.backgroundView[[UIImageView alloc] initWithImage: SumDummyImage ];
0
Corona

プログラムでsubViewと制約を追加していますが、次のコードが役立ちます。

lazy var imageView: UIImageView = { [unowned self] in
    let imageView = UIImageView(frame: self.contentView.frame)
    imageView.contentMode = .scaleAspectFill
    imageView.clipsToBounds = true

    return imageView
}() 

func updateCellWith(image: UIImage) {

    contentView.subviews.forEach { $0.removeFromSuperview() }

    contentView.addSubview(imageView)
    imageView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0).isActive = true
    imageView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 0).isActive = true
    imageView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0).isActive = true
    imageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0).isActive = true

    self.imageView.autoresizingMask.insert(.flexibleHeight)
    self.imageView.autoresizingMask.insert(.flexibleWidth)

    imageView.image = image

}
0
Ethandf