在CollectionView
中,一些单元格应该有一个额外的子视图或图层。可以告诉CollectionView
调整其大小,因此所有内容都需要适当调整大小。
目前,从包含具有imageview的单元的笔尖初始化单元;单元格nib链接到自定义UICollectionViewCell
子类,只执行init。检查自动调整子视图。
CollectionView
被告知通过在sizeForItemAtIndexPath:
中导出并返回的值来调整单元格的大小。我已经将一个FlowLayout子类化,但它只指定了ScrollDirection
和Insets
。
所有这一切都很好。问题:如何将子视图/图层添加到单元格,以便它也正确调整大小?我尝试使用translatesAutoresizingMaskIntoConstraints
关闭添加子视图和图层,但这些根本不会自动更改大小。还尝试使用代码框架/视图而不是nib。
我现在得到的最好的是cell.contentView.layer
子层,我在cellForItemAtIndexPath:
中添加;通过存储来自frame.size
的单元格的sizeForItemAtIndexPath:
来“手动”调整大小,这不仅是丑陋的,而且最终还有不同大小的不同单元的子层。
任何帮助赞赏!
我刚才遇到了同样的问题。
使用UICollectionViewFlowLayoutDelegate方法根据设备和设备方向设置单元格大小时,将正确计算大小,但子视图不会调整大小以填充新大小的单元格。效果是一个大的空白单元格,小的子视图不填充单元格的边界/保持大小等于它们在xib文件中的当前值。
我通过在awakeFromNib
中执行以下操作来解决这个问题:
- (void)awakeFromNib
{
[super awakeFromNib];
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
self.contentView.translatesAutoresizingMaskIntoConstraints = YES;
}
在此之前,contentView掩码是nil
。
我有同样的问题。在两个布局之间切换没有调整单元格内的图片(UIImage)的大小。我的单元格在没有xib的情况下构建。我为每个CollectionViewCustomLayout使用了两个不同的单元类。
我以编程方式修复此问题:
self.autoresizesSubviews = YES;
在我的UICollectionViewCell子类中。
但这只对我有用,可以将Picture添加为像这样的单元格backgroundpicture:
cell.backgroundView[[UIImageView alloc] initWithImage: SumDummyImage ];
*override func awakeFromNib() {
super.awakeFromNib()
self.contentView.autoresizingMask.insert(.FlexibleHeight)
self.contentView.autoresizingMask.insert(.FlexibleWidth)
}
这对我有用..这段代码在你的子类UICollectionViewCell.swift文件里面(你的代码涉及自定义单元格)
快速解决方案*
作为启用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;
但是当我在集合视图中有不同大小的单元格时,它会弄乱事物并且图像有时会占用不同单元格的大小。
所以我转向使用细胞界限 - 你实际上做得很好。
那么也许尝试一下?
一个简单的自动布局解决方案是为容器视图设置约束。
因此,如果我们有一个带有父视图的图像视图,我们基本上想要告诉子视图(图像视图)保持0到容器视图的前导,尾随,底部和顶部空间距离。
根据here的说法,@ Alfie Hanssen解决方案(this article)对我不起作用:
XIB中单元视图的大小为50 x 50点,这是流布局中设置的集合视图单元的默认大小。即使在Interface Builder中使用这么小的单元格也有点困难,最好不要更改默认大小。问题是Auto Layout将手动设置的大小视为已修复,并在尝试自动调整单元格高度时生成NSAutoresizingMaskLayoutConstraint错误
我检查了UICollectionViewCell,发现单元格和contentView之间有一个视图,该视图具有固有的宽度和高度约束。而不是AutoresizingMask我只是更新如下,似乎为我工作。
override func layoutSubviews() {
contentView.superview?.frame = bounds
super.layoutSubviews()
}
解决方案是关闭单元格xib的自动约束,并激活图像视图的自动调整大小中的灵活宽度/高度箭头。
我正在以编程方式添加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
}