45

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

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

CollectionView、 で導出されて返された値によってセルのサイズを変更するように指示されsizeForItemAtIndexPath:ます。ScrollDirectionFlowLayout をサブクラス化しましたが、 andのみを指定していますInsets

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

私が今得た最高のものは、cell.contentView.layer私が追加したサブレイヤーcellForItemAtIndexPath:です。frame.sizeこれは、セルのfromを格納することによって「手動で」サイズ変更されますsizeForItemAtIndexPath:。これは、醜いだけでなく、セルごとにさまざまなサイズのサブレイヤーになってしまいます。

どんな助けでも大歓迎です!

4

10 に答える 10

88

私はちょうど今同じ問題に遭遇しました。

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

で次のことを行うことでこれを解決しましたawakeFromNib

- (void)awakeFromNib
{
    [super awakeFromNib];

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

これを行う前は、contentView マスクはnil.

于 2014-09-10T20:26:25.990 に答える
23
*override func awakeFromNib() {
    super.awakeFromNib()

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

これは私にとってはうまくいきました..このコードは、サブクラス化された UICollectionViewCell.swift ファイル(カスタムセルを含むコードが配置されている場所)の内部に入ります

迅速な解決*

于 2016-03-24T22:23:07.987 に答える
8

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

self.contentView.frame = self.bounds;

これにより、Xcode 6 で問題があったカスタム コレクション ビュー レイアウトがすべて修正されました。

于 2014-09-23T06:26:50.957 に答える
3

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

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

親ビューでサイズ変更する自動レイアウト制約

于 2014-04-15T00:01:04.857 に答える
3

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

UICollectionViewCellの場合はセル枠に画像をセットします + self.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

しかし、コレクションビューに異なるサイズのセルがあると、混乱し、画像が異なるセルのサイズになることがありました。

そこで、セルの境界を操作することにしましたが、実際にはうまくいきました。

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

于 2014-03-06T09:59:14.653 に答える
2

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

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

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

override func layoutSubviews() {
    contentView.superview?.frame = bounds
    super.layoutSubviews()
}
于 2016-06-03T10:10:33.567 に答える
0

解決策は、セル xib の AutoConstraints をオフにし、imageviews の AutoResize で柔軟な幅/高さの矢印を有効にすることでした。

于 2013-03-09T13:48:38.920 に答える