UICollectionViewCell中的自动布局不起作用

我有一个简单的UICollectionView与具有单个UITextView的单元格。 UITextView被限制在单元格的边缘,所以它们应该保持与单元格大小相同的大小。

我遇到的问题是,由于某些原因,当我通过collectionView:layout:sizeForItemAtIndexPath:指定单元格大小时,这些约束不起作用。

我在Storyboard中将单元格大小设置为320×50。 如果我用sizeForItemAtIndexPath:返回大小为单元大小的2倍的大小,UITextView保持相同的高度,尽pipe我设置了约束。 我正在使用Xcode 6 GM。

我的视图控制器代码是:

@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设置的故事板的屏幕截图:

在这里输入图像描述

我知道使用自动布局约束与UITableViewCells和dynamicresize工作正常。 我不知道为什么在这种情况下不起作用。 有没有人有任何想法?

那么,我只是看着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 } } 

这里是解决scheme,如果你不是UICollectionViewCell 。 在你的cellForItemAtIndexPath:下面添加这两行cellForItemAtIndexPath: dequeueReusableCellWithReuseIdentifier:

OBJ-C

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

Swift – 2.0

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

Swift 2.0:

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