45

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

目前,该单元格是从一个包含带有 imageview 的单元格的 nib 初始化的;单元格笔尖链接到自定义UICollectionViewCell子类,该子类仅执行 init。自动调整子视图被选中。

CollectionView告知通过在 中派生和返回的值来调整单元格的大小sizeForItemAtIndexPath:。我对 FlowLayout 进行了子类化,但它只指定ScrollDirectionInsets.

所有这些工作正常。问题:如何将子视图/图层添加到单元格,以便它也正确调整大小?我尝试在关闭的情况下添加子视图和图层translatesAutoresizingMaskIntoConstraints,但它们根本不会自动改变大小。还尝试使用代码框架/视图而不是笔尖。

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

任何帮助表示赞赏!

4

10 回答 10

88

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

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

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

- (void)awakeFromNib
{
    [super awakeFromNib];

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

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

于 2014-09-10T20:26:25.990 回答
23
*override func awakeFromNib() {
    super.awakeFromNib()

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

这对我有用.. 此代码位于您的子类 UICollectionViewCell.swift 文件中(涉及自定义单元格的代码所在的位置)

快速解决方案*

于 2016-03-24T22:23:07.987 回答
8

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

self.contentView.frame = self.bounds;

这可以解决我在 Xcode 6 中出现问题的所有自定义集合视图布局。

于 2014-09-23T06:26:50.957 回答
5

在另一个没有 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
于 2014-01-25T20:20:16.183 回答
3

如果可能,我总是更喜欢自动布局。但有时,当视图仅由其父视图直接确定时,使用框架和边界只是一种节省时间的方法。

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

但是当我在 collectionView 中有不同大小的单元格时,它会搞砸事情,图像有时会占用不同单元格的大小。

因此,我转向处理细胞边界,并且 - 实际效果很好。

所以也许试试看?

于 2014-03-06T09:59:14.653 回答
3

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

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

自动布局约束以调整父视图的大小

于 2014-04-15T00:01:04.857 回答
2

根据这篇文章, @Alfie Hanssen 解决方案(这里)对我来说不能正常工作:

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

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

override func layoutSubviews() {
    contentView.superview?.frame = bounds
    super.layoutSubviews()
}
于 2016-06-03T10:10:33.567 回答
1

我正在以编程方式添加 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

}
于 2017-08-18T15:52:27.643 回答
0

解决方案是关闭单元格 xib 的 AutoConstraints 并激活图像视图的 AutoResize 中的灵活宽度/高度箭头。

于 2013-03-09T13:48:38.920 回答
0

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

我以编程方式解决了这个问题:

self.autoresizesSubviews = YES;

在我的 UICollectionViewCell 子类中。

但这仅对我有用,方法是将图片添加为单元格背景图片,如下所示:

cell.backgroundView[[UIImageView alloc] initWithImage: SumDummyImage ];
于 2014-01-23T18:39:52.237 回答