当前位置: 首页 > 知识库问答 >
问题:

uicollectionview cell systemLayoutSizeFittingSize返回不正确的宽度

沈思博
2023-03-14

我一直在摆弄动态UICollectionViewCell,并注意到在iOS 8上对< code > uicollectionview cell 调用< code > cell . content view . systemlayoutsizefittingsize(uilayoutfitingcompressedsize)会返回不正确的宽度。目前解决这个问题的唯一方法是显式添加一个宽度约束来强制单元格的宽度。以下代码用于单元格子类:

func calculatePreferredHeightForFrame(frame: CGRect) -> CGFloat {
    var newFrame = frame
    self.frame = newFrame
    let widthConstraint = NSLayoutConstraint(item: contentView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: CGRectGetWidth(frame))
    contentView.addConstraint(widthConstraint)
    self.setNeedsUpdateConstraints()
    self.updateConstraintsIfNeeded()
    self.setNeedsLayout()
    self.layoutIfNeeded()
    let desiredHeight: CGFloat = self.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
    newFrame.size.height = CGFloat(ceilf(Float(desiredHeight)))
    contentView.removeConstraint(widthConstraint)
    return CGRectGetHeight(newFrame)
}

我知道,在iOS 8和动态UICollectionViewFlowLayout中,UICollectionViewCell的contentView处理约束的方式不同,但这里有我遗漏的东西吗?要确保systemLayoutSizeFittingSize在单元格上使用特定宽度,需要做什么?

我也看到了这篇文章(使用自动布局在UICollectionView中指定单元格的一个维度),我相信这可能会使我的问题无效。也许UICollectionViewFlowLayout不是为只有一个动态维度的单元格设计的,但这仍然不能解释为什么单元格给出了异常的宽度。

共有3个答案

陶寒
2023-03-14

SSCCE(示例)在我的存储库中可用:

https://github.com/knutvalen/sandbox-uicollectionview

下面是主要代码的一个片段。

斯威夫特 4

var array = ["foo", "bar", "baz"]

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)

    if let myCell = cell as? MyCollectionViewCell {
        myCell.titleLabel.text = array[indexPath.item]
        myCell.subtitleLabel.text = "my subtitle for " + array[indexPath.item] + " is a very long text with many letters and words"
        return myCell
    }

    return cell
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let forcedWidth: CGFloat = 200
    let myCell = MyCollectionViewCell()
    myCell.titleLabel.text = array[indexPath.item]
    myCell.subtitleLabel.text = "my subtitle for " + array[indexPath.item] + " is a very long text with many letters and words"
    myCell.subtitleLabel.preferredMaxLayoutWidth = forcedWidth - (myCell.myMargin * 2)
    let optimalSize = myCell.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
    let forcedSize = CGSize(width: forcedWidth, height: optimalSize.height)
    return forcedSize
}

输出

何建中
2023-03-14

在我的情况下,它没有正确计算宽度,因为我在调用系统布局大小调整大小方法之前缺少这两行:

[sizingCell setNeedsLayout];
[sizingCell layoutIfNeeded];

花了几个小时才发现它,希望它能对其他有类似问题的人有所帮助。

公冶经纶
2023-03-14

我也面临同样的问题。关键是在系统规模过大时使用优先级。

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    if (!self.prototypeCell) {
        self.prototypeCell = [TrainingMenuCell new];
        self.prototypeCell.contentView.translatesAutoresizingMaskIntoConstraints = NO;
    }

    [self configureCell:self.prototypeCell forIndexPath:indexPath];
    [self.prototypeCell setNeedsLayout];
    [self.prototypeCell layoutIfNeeded];

    CGFloat width = CGRectGetWidth(collectionView.frame) - 12;
    CGSize fittingSize = UILayoutFittingCompressedSize;
    fittingSize.width = width;

    CGSize size = [self.prototypeCell.contentView systemLayoutSizeFittingSize:fittingSize withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityDefaultLow];
    return size;
}
 类似资料:
  • 问题内容: def size_of_dir(dirname): print(“Size of directory: “) print(os.path.getsize(dirname)) 是有问题的代码。dirname是一个目录,其中包含 130个 文件,每个文件约 1kb 。当我调用此函数时,它返回 4624 ,这 不是 目录的大小…为什么? 问题答案: 此值(4624B)代表的大小 文件 是 描

  • 我正在使用postgis计算两个地理坐标之间的距离。 它返回给我53536.743496517米,大约等于54公里,但实际距离是103公里,我通过http://boulter.com/gps/distance/ 我在询问中是否做错了什么?

  • 我正在尝试在代码中使用NSPredicate搜索名称。搜索工作正常,但不会返回适当的结果。当我搜索一个名称(例如“Colin”)时,它会返回表中的所有其他名称或另一个名称(例如“Mike”),但如果我输入一个不存在的随机字符串,它会返回:“找不到结果”。当我在搜索栏中键入一个名字(例如Lisa)时,我希望它能找到这个名字(Lisa)并返回它,但它没有这样做 这是我的代码: 自己name返回表中的所

  • 问题内容: 我刚遇到getResourceAsStream()一个非常奇怪的问题。 在我的产品项目JUnit测试中,我使用getResourceAsStream()读取测试数据,我发现getResourceAsStream()有时会替换一些字节: 在此项目中的输出如下所示: D0 9A D1 80 D0 B8 D0 BC D0 B8 D0 BD D0 B0 D0 BB D0 B8 D1 81 D1

  • 我有一个Vue.js应用程序,我的部署设置非常标准, 豆荚- 这是相关代码, Dockerfile: Nginx。形态: Ingress Prod:(为了简洁起见,仅保留必要的位), 本地入口: 我得到的错误是, 未捕获的语法错误:意外令牌 未捕获的语法错误:意外令牌 网络选项卡中这两种资源的内容类型都是。 编辑1: 这是部署后我的文件夹的外观, 我的js文件的路径是,