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

问题描述 投票:36回答:10

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

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

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

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

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

任何帮助赞赏!

ios size cell subview uicollectionview
10个回答
83
投票

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

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

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

- (void)awakeFromNib
{
    [super awakeFromNib];

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

在此之前,contentView掩码是nil


0
投票

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

我以编程方式修复此问题:

self.autoresizesSubviews = YES;

在我的UICollectionViewCell子类中。

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

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

18
投票
*override func awakeFromNib() {
    super.awakeFromNib()

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

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

快速解决方案*


6
投票

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

self.contentView.frame = self.bounds;

这有助于修复所有与Xcode 6有问题的自定义集合视图布局。


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

3
投票

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

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

但是当我在集合视图中有不同大小的单元格时,它会弄乱事物并且图像有时会占用不同单元格的大小。

所以我转向使用细胞界限 - 你实际上做得很好。

那么也许尝试一下?


3
投票

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

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


2
投票

根据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()
}

0
投票

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


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

}
© www.soinside.com 2019 - 2024. All rights reserved.