自动布局:无法获取 UICollectionViewCell 子视图的帧大小

Posted

技术标签:

【中文标题】自动布局:无法获取 UICollectionViewCell 子视图的帧大小【英文标题】:Auto Layout: can't get the frame size of UICollectionViewCell subViews 【发布时间】:2013-07-31 13:09:43 【问题描述】:

我有一个自定义 UICollectionViewCell 子类 (MyCell),它的界面是使用自动布局在 Interface Builder 中设置的。该单元格有一个图像视图和一个标签。

现在,当我配置单元格时,我需要知道图像视图的宽度和高度。听起来很简单,但看起来不可能。

在我的视图控制器中:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
    MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];
    cell.itemNumber = indexPath.item;
    return cell;

在我的单元格子类中,我使用属性的设置器来自定义单元格:

- (void)setItemNumber:(NSInteger)itemNumber 
    _itemNumber = itemNumber;
    self.label.text = [NSString stringWithFormat:@"%i", self.itemNumber];

    // In my actual project I need to know the image view's width and hight to request an image
    // of the right size from a server. Sadly, the frame is always 0, 0, 0, 0
    // (same for the bounds)
    NSLog(@"%@", NSStringFromCGRect(self.myImageView.frame));

完整的示例项目可以在https://github.com/kevinrenskers/CollectionViewAutoLayoutTest找到。

所以问题是这样的:我需要知道图像视图的大小,因为我需要请求服务器生成正确大小的图像。并且图像视图的大小是 0,0..

我也尝试在 -layoutSubviews 方法中进行自定义:

- (void)setItemNumber:(NSInteger)itemNumber 
    _itemNumber = itemNumber;


- (void)layoutSubviews 
    if (self.myImageView.frame.size.height) 
        self.label.text = [NSString stringWithFormat:@"%i", self.itemNumber];
        NSLog(@"%@", NSStringFromCGRect(self.myImageView.frame));
    

可悲的是,这更加混乱。该方法被调用了两次,首先帧是 0, 0, 0, 0 然后帧设置正确。因此,检查高度的 if 语句。但是,一旦您开始滚动,就会为错误的单元格显示错误的标签。我不明白这里发生了什么。

当您在example project 中尝试时,这个问题可能更有意义。

设置宽度和高度约束并为其制作 IBOutlets 听起来是个不错的选择,但遗憾的是单元格没有固定大小,并且图像需要随着单元格缩小和增长。删除自动布局也不是一种选择。

【问题讨论】:

从您的代码来看,您没有初始化标签或 imageView。这是正确的,还是您只是省略了此示例项目的代码? 是什么决定了图像视图的大小? 我正在使用情节提要,这就是初始化 imageView 和标签的原因。大小由自动布局确定,使用顶部、底部、左侧和右侧约束。 【参考方案1】:

最后,我在图像视图(超级视图)上添加了顶部、右侧、底部和左侧间距约束,向它们添加了 IBOutlets 并使用了类似这样的东西:

CGFloat height = self.contentView.bounds.size.height - self.topConstraint.constant - self.bottomConstraint.constant;
CGFloat width = self.contentView.bounds.size.width - self.leftConstraint.constant - self.rightConstraint.constant;

【讨论】:

以上是关于自动布局:无法获取 UICollectionViewCell 子视图的帧大小的主要内容,如果未能解决你的问题,请参考以下文章

在布局更改的同时重新加载/动画 UICollectionView

带有 UITextView 的 UITableViewCell 中的自动布局

在 TableViewCell 中自动布局两个标签?

无法在情节提要中启用自动布局

vb.net 获取键盘布局

使用自动布局获取 uiscrollview 的高度