UICollectionView单元格子视图不resize
在一个CollectionView中,一些单元格应该有一个附加的子视图或图层。 可以告诉CollectionView调整其单元格大小,因此所有内容都需要适当resize。
目前,这个单元格是从一个包含一个单元格的图像视图初始化的; 单元格笔尖链接到一个自定义的UICollectionViewCell子类,只有init。 Autoresize子视图被选中。
CollectionView被告知通过“sizeForItemAtIndexPath:”派生的值来返回单元格的大小。 我已经子类化FlowLayout,但它只指定ScrollDirection和Insets。
所有这一切工作正常。 问题:如何将子视图/图层添加到单元格,以便它也正确resize? 我尝试添加translatesAutoresizingMaskIntoConstraintsclosures子视图和图层,但这些不会自动更改大小。 也试图使用代码框架/视图,而不是笔尖。
我现在得到的最好的是cellForItemAtIndexPath中添加的cell.contentView.layer子图层: 这是通过从sizeForItemAtIndexPath:中存储单元格的frame.size来“手动”resize,这不仅是丑陋的,而且还以不同的单元格具有各种大小的子层结束。
任何帮助感激!
我刚才遇到同样的问题。
使用UICollectionViewFlowLayoutDelegate方法根据设备和设备方向设置单元大小时,大小将被正确计算,但子视图不会resize以填充新大小的单元格。 效果是一个大的空白单元格与小子视图不填满单元格的边界/保持大小等于他们的当前值在xib文件。
我通过在awakeFromNib
执行以下操作来解决此问题:
- (void)awakeFromNib { [super awakeFromNib]; self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; self.contentView.translatesAutoresizingMaskIntoConstraints = YES; }
在这之前,contentView掩码是nil
。
*override func awakeFromNib() { super.awakeFromNib() self.contentView.autoresizingMask.insert(.FlexibleHeight) self.contentView.autoresizingMask.insert(.FlexibleWidth) }
这对我工作..这段代码进入你的子类UICollectionViewCell.swift文件(你的代码涉及自定义单元格所在的位置)
Swift解决scheme*
作为启用AutoResizingMask的替代方法,对于具有可变高度的自定义UICollectionViewLayouts(例如,在手动设置某些约束的情况下并且需要translatesAutoresizingMaskIntoConstraints保持为NO),可以将以下内容添加到单元格中的layoutSubviews中:
self.contentView.frame = self.bounds;
这工作,以解决所有的问题与Xcode 6我的自定义集合视图布局。
在另一个没有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
如果可能,我总是喜欢自动布局。 但有时使用框架和边界只是一个时间,当一个视图是由它的超视图直接确定。
在UICollectionViewCell的情况下,我将图像设置为单元格框架+ self.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
但是,当我在collectionView中拥有不同大小的单元格时,它会将事物弄糟,而图像有时会占用不同单元格的大小。
所以我转而和细胞界限一起工作,而且你们的工作很好。
所以也许试试看?
一个简单的自动布局解决scheme是为容器视图设置约束。
所以,如果我们有一个父视图的图像视图,我们基本上要告诉子视图(图像视图)保持领先,尾随,底部和顶部空间距离0到容器视图。
根据这篇文章 ,@Alfie Hanssen解决scheme( 这里 )对我来说工作不正常:
XIB中单元格视图的大小为50 x 50点,这是在stream布局中设置的集合视图单元格的默认大小。 即使使用Interface Builder中的这个小单元有点难,最好不要更改默认大小。 问题是自动布局认为手动设置的大小是固定的,并生成一个NSAutoresizingMaskLayoutConstraint错误,当它试图自动调整单元格的高度
我已经检查了UICollectionViewCell,并发现单元格和contentView之间存在一个视图,并且该视图具有固有的宽度和高度约束。 而不是AutoresizingMask我只是更新如下,似乎为我工作。
override func layoutSubviews() { contentView.superview?.frame = bounds super.layoutSubviews() }
解决scheme是closures单元格xib的AutoConstraints,并激活图像浏览器AutoResize中的灵活宽度/高度箭头。
我有同样的问题。 两个布局之间的切换没有调整我的单元格内的图片(UIImage)。 我的单元格在没有xib的情况下构build。 我为每个CollectionViewCustomLayout使用了两个不同的单元格类。
我用这个编程方式解决了这个问题:
self.autoresizesSubviews = YES;
在我的UICollectionViewCell子类中。
但是,这只适用于我添加图片作为单元格backgroundpicture像这样:
cell.backgroundView[[UIImageView alloc] initWithImage: SumDummyImage ];
我以编程方式添加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 }