UICollectionView单元子视图不会调整大小

时间:2013-03-08 20:54:20

标签: ios size cell subview uicollectionview

CollectionView中,某些单元格应该有一个额外的子视图或图层。可以告诉CollectionView调整其单元格的大小,因此所有内容都需要适当调整大小。

目前,从包含具有imageview的单元格的笔尖初始化单元格;单元格nib链接到自定义UICollectionViewCell子类,只执行init。检查自动调整子视图。

CollectionView被告知通过sizeForItemAtIndexPath:中派生并返回的值来调整单元格的大小。我已经将FlowLayout子类化了,但它只指定了ScrollDirectionInsets

所有这一切都很好。问题:如何将子视图/图层添加到单元格,以便它也正确调整大小?我尝试将translatesAutoresizingMaskIntoConstraints关闭添加到子视图和图层,但这些根本不会自动更改大小。还尝试使用代码框架/视图而不是nib。

我现在得到的最好的是cell.contentView.layer子图层,我在cellForItemAtIndexPath:中添加了它;通过存储来自frame.size的单元格sizeForItemAtIndexPath:来“手动”调整大小,这不仅是丑陋的,而且最终还有不同大小的不同单元的子层。

任何帮助表示赞赏!

10 个答案:

答案 0 :(得分:83)

我刚才遇到了同样的问题。

使用UICollectionViewFlowLayoutDelegate方法根据设备和设备方向设置单元格大小时,将正确计算大小,但子视图不会调整大小以填充新大小的单元格。效果是一个大的空白单元格,小的子视图不会填充单元格的边界/保持大小等于它们在xib文件中的当前值。

我通过在awakeFromNib中执行以下操作解决了这个问题:

- (void)awakeFromNib
{
    [super awakeFromNib];

    self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    self.contentView.translatesAutoresizingMaskIntoConstraints = YES;
}

在执行此操作之前,contentView掩码为nil

答案 1 :(得分:18)

*override func awakeFromNib() {
    super.awakeFromNib()

    self.contentView.autoresizingMask.insert(.FlexibleHeight)
    self.contentView.autoresizingMask.insert(.FlexibleWidth)
}

这对我有用..这段代码在你的子类UICollectionViewCell.swift文件里面(你的代码涉及自定义单元格所在的位置)

快速解决方案*

答案 2 :(得分:6)

作为启用AutoResizingMask的替代方法,对于具有可变高度的自定义UICollectionViewLayouts,例如,您手动设置某些约束并需要translatesAutoresizingMaskIntoConstraints保持为NO,您可以将以下内容添加到单元格中的layoutSubviews:

self.contentView.frame = self.bounds;

这可以修复我在Xcode 6中遇到问题的所有自定义集合视图布局。

答案 3 :(得分:4)

在没有xibs的另一个项目中,我将UICollectionViewCell子类化,并为此产生了同样的效果:

#import "CVcell.h"

@implementation CVcell

@synthesize cellImage;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        CGFloat cellSize = self.contentView.bounds.size.width;
        cellImage = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, cellSize, cellSize)];
        [cellImage setClipsToBounds:YES];

        cellImage.translatesAutoresizingMaskIntoConstraints = NO;
        cellImage.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
        [self.contentView addSubview:cellImage];

    }
    return self;
}

@end

答案 4 :(得分:3)

我总是喜欢自动布局。 但是,当仅通过其超级视图确定视图时,有时使用帧和边界只是节省时间。

在UICollectionViewCell的情况下,我将图像设置为单元格框架+         self.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

但是当我在collectionView中有不同大小的单元格时,它会弄乱一些东西,图像有时会占用不同单元格的大小。

所以我转向使用细胞界限 - 你们这些结果很好。

所以也许试一试?

答案 5 :(得分:3)

一个简单的自动布局解决方案是为容器视图设置约束。

因此,如果我们有一个带有父视图的图像视图,我们基本上想要告诉子视图(图像视图)保持0到容器视图的前导,尾随,底部和顶部空间距离。

Auto layout constraints to resize with parent view

答案 6 :(得分:2)

根据{{​​3}}的说法,@ Alfie Hanssen解决方案(here)对我来说无法正常工作:

  

XIB中单元格视图的大小为50 x 50点,这是在流布局中设置的集合视图单元格的默认大小。即使在Interface Builder中使用这么小的单元格也有点困难,最好不要更改默认大小。问题是Auto Layout将手动设置的大小视为已修复,并在尝试自动调整单元格高度时生成NSAutoresizingMaskLayoutConstraint错误

我检查了UICollectionViewCell,发现单元格和contentView之间有一个视图,该视图具有固有的宽度和高度约束。而不是AutoresizingMask我只是更新如下,似乎为我工作。

override func layoutSubviews() {
    contentView.superview?.frame = bounds
    super.layoutSubviews()
}

答案 7 :(得分:0)

解决方案是关闭单元格xib的自动约束,并激活图像视图的自动调整大小中的灵活宽度/高度箭头。

答案 8 :(得分:0)

我遇到了同样的问题。在两个布局之间切换没有调整单元格内的图片(UIImage)的大小。我的单元格在没有xib的情况下构建。我为每个CollectionViewCustomLayout使用了两个不同的单元类。

我用这个编程修改了这个:

self.autoresizesSubviews = YES;

在我的UICollectionViewCell子类中。

但这只对我有用,可以将Picture添加为像这样的单元格backgroundpicture:

cell.backgroundView[[UIImageView alloc] initWithImage: SumDummyImage ];

答案 9 :(得分:0)

我正在以编程方式添加subView和约束,以下代码适用于我:

lazy var imageView: UIImageView = { [unowned self] in
    let imageView = UIImageView(frame: self.contentView.frame)
    imageView.contentMode = .scaleAspectFill
    imageView.clipsToBounds = true

    return imageView
}() 

func updateCellWith(image: UIImage) {

    contentView.subviews.forEach { $0.removeFromSuperview() }

    contentView.addSubview(imageView)
    imageView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0).isActive = true
    imageView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 0).isActive = true
    imageView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0).isActive = true
    imageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0).isActive = true

    self.imageView.autoresizingMask.insert(.flexibleHeight)
    self.imageView.autoresizingMask.insert(.flexibleWidth)

    imageView.image = image

}