在CollectionView
中,某些单元格应该有一个额外的子视图或图层。可以告诉CollectionView
调整其单元格的大小,因此所有内容都需要适当调整大小。
目前,从包含具有imageview的单元格的笔尖初始化单元格;单元格nib链接到自定义UICollectionViewCell
子类,只执行init。检查自动调整子视图。
CollectionView
被告知通过sizeForItemAtIndexPath:
中派生并返回的值来调整单元格的大小。我已经将FlowLayout子类化了,但它只指定了ScrollDirection
和Insets
。
所有这一切都很好。问题:如何将子视图/图层添加到单元格,以便它也正确调整大小?我尝试将translatesAutoresizingMaskIntoConstraints
关闭添加到子视图和图层,但这些根本不会自动更改大小。还尝试使用代码框架/视图而不是nib。
我现在得到的最好的是cell.contentView.layer
子图层,我在cellForItemAtIndexPath:
中添加了它;通过存储来自frame.size
的单元格sizeForItemAtIndexPath:
来“手动”调整大小,这不仅是丑陋的,而且最终还有不同大小的不同单元的子层。
任何帮助表示赞赏!
答案 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到容器视图的前导,尾随,底部和顶部空间距离。
答案 6 :(得分:2)
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
}