web-dev-qa-db-ja.com

UICollectionViewCellの自動レイアウトが機能しない

単一のUITextViewを持つセルを持つ単純なUICollectionViewがあります。 UITextViewはセルの端に制限されているため、セルのサイズと同じサイズを維持する必要があります。

私が抱えている問題は、何らかの理由で、collectionView:layout:sizeForItemAtIndexPath:を介してセルサイズを指定すると、これらの制約が機能しないことです。

ストーリーボードでセルサイズを320x50に設定しています。 sizeForItemAtIndexPath:でセルサイズの2倍の高さのサイズを返す場合、UITextViewは、設定した制約にかかわらず同じ高さのままです。 Xcode 6 GMを使用しています。

私のView Controllerコードは次のとおりです。

@implementation TestViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.collectionView.delegate = self;
    self.collectionView.dataSource = self;
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    UICollectionViewCell *c = [self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];

    NSLog(@"%f", c.frame.size.height);

    UITextView *tv = (UITextView *)[c viewWithTag:9];
    NSLog(@"%f", tv.frame.size.height);

}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 1;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

    return cell;
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewFlowLayout *flowLayout = (UICollectionViewFlowLayout *)collectionView.collectionViewLayout;

    CGSize size = flowLayout.itemSize;

    size.height = size.height * 2;

    return size;
}

@end

ViewDidAppearのログ:次の出力を表示します。
100.00000
50.00000
ご覧のとおり、UITextViewの高さはセルの高さによって変わりません。


UICollectionViewCellに制約されたUITextViewで設定したストーリーボードのスクリーンショットは次のとおりです。

enter image description here

自動レイアウト制約の使用は、UITableViewCellsおよび動的なサイズ変更でうまく機能することを知っています。この場合、なぜ機能しないのかわかりません。誰にもアイデアはありますか?

50
ryanthon

さて、私はiOS開発者フォーラムを見たところです。どうやら、これはiOS 7デバイスで実行されているiOS 8 SDKのバグです。回避策は、UICollectionViewCellのサブクラスに次を追加することです。

- (void)setBounds:(CGRect)bounds {
    [super setBounds:bounds];
    self.contentView.frame = bounds;
}
override var bounds: CGRect {
    didSet {
      contentView.frame = bounds
    }
}
109
ryanthon

同等のSwift Code:

override var bounds: CGRect {
    didSet {
      contentView.frame = bounds
    }
}
40
Hamza

UICollectionViewCellをサブクラス化しない場合の解決策は次のとおりです。 cellForItemAtIndexPath:の後にdequeueReusableCellWithReuseIdentifier:の下にこの2行を追加するだけです

Obj-C

[[cell contentView] setFrame:[cell bounds]];
[[cell contentView] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];

スイフト-2.0

cell.contentView.frame = cell.bounds
cell.contentView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
24
itsji10dra

Swift 2.0:

cell.contentView.frame = cell.bounds
cell.contentView.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
3
Bill Chan