UICollectionViewCell中的自动布局不起作用如何解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (50)

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

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

我在Storyboard中将单元格大小设置为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设置的storyboard的屏幕截图:

我知道使用自动布局约束可以很好地处理UITableViewCells和动态调整大小。我不知道为什么它在这种情况下不起作用。

提问于
用户回答回答于

这是iOS 7设备上运行的iOS 8 SDK的一个错误。解决方法是将以下内容添加到你的UICollectionViewCell的子类中:

- (void)setBounds:(CGRect)bounds {
    [super setBounds:bounds];
    self.contentView.frame = bounds;
}
用户回答回答于

等效的Swift代码:

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

扫码关注云+社区

领取腾讯云代金券