UICollectionViewCell中的自动布局无法正常工作

时间:2014-09-12 09:06:35

标签: ios uicollectionview autolayout uicollectionviewcell

我有一个简单的UICollectionView,单元格有一个UITextView。 UITextView被约束到单元格的边缘,因此它们应该与单元格大小保持相同的大小。

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

我在故事板中将单元格大小设置为320x50。如果我使用sizeForItemAtIndexPath:返回大小为单元格大小2倍的大小,则尽管我设置了约束,但UITextView仍保持相同的高度。我正在使用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设置的故事板的屏幕截图:

enter image description here

我知道使用自动布局约束可以很好地使用UITableViewCells和动态调整大小。我不知道为什么它不能在这种情况下工作。有没有人有任何想法?

4 个答案:

答案 0 :(得分:109)

好吧,我刚看了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
    }
}

答案 1 :(得分:40)

等效的Swift代码:

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

答案 2 :(得分:24)

如果您不是UICollectionViewCell的子类,那么这是解决方案。只需在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]

答案 3 :(得分:3)

Swift 2.0:

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