在iOS 13上未调用`systemLayoutSizeFittingSize`

时间:2019-07-24 13:48:02

标签: ios uicollectionview ios13

我在iOS 13 Beta上遇到systemLayoutSizeFittingSize的问题。我正在为NativeScript开发一个插件,该插件使用systemLayoutSizeFittingSize中的UICollectionViewCell来“测量和布局”单元格中的UIView。我一直在做的是:

  • 如果我需要对单元格中的systemLayoutSizeFittingSize进行度量/布局,请手动调用UIView

  • 等待操作系统调用systemLayoutSizeFittingSize并再次测量和布置单元格中的UIView

在iOS 13 beta之前,所有功能都可以完美运行,在该操作系统看来systemLayoutSizeFittingSize API的调用方式已经发生了变化。在iOS 13 beta中,当UICollectionView完成加载其项目并且单元格中的UIView更改其布局时,操作系统不会调用API。在iOS 12及更低版本中,在UICollectionView完成其初始布局传递并且单元格的UIView更改后,systemLayoutSizeFittingSize被引发。

也许这是我必须更改或调用UIView本身或UICollectionView才能使其像在iOS 12中一样工作的东西,但是如果我使用systemLayoutSizeFittingSize,我会有点迷茫正确。

所以我的问题是,我是否应该期望systemLayoutSizeFittingSize由操作系统自动调用,或者这仅仅是手动强制UICollectionViewCell告知其大小的一种方法?总体而言,我使用正确吗?

编辑:

经过进一步调查,iOS 13(测试版)的systemLayoutSizeFittingSize似乎有所变化。设置布局的estimatedItemSize时,它不再像以前那样被调用。我创建了一个项目,该项目显示了由行为更改引起的问题,并将向iOS团队报告。可以找到项目here。此问题导致以下行为:由于不再调用systemLayoutSizeFittingSize,因此在使用UICollectionView时无法实现“自定义大小”单元格。

1 个答案:

答案 0 :(得分:3)

似乎当前的iOS 13.0 beta版( simulator版本11.0(SimulatorApp-895.6 SimulatorKit-553.12 CoreSimulator-643.11 ))没有发生内部重大变化,发行说明中未对此进行记录。更改是systemLayoutSizeFittingSize中的UICollectionViewCell在调用systemLayoutSizeFitting(_:withHorizontalFittingPriority:verticalFittingPriority:)时被不再调用。

所以:

  • systemLayoutSizeFittingSize在iOS <12上被调用
  • systemLayoutSizeFitting(_:withHorizontalFittingPriority:verticalFittingPriority:)在iOS> 13上被调用

解决方案/解决方法

因此,作为一种解决方案/解决方法,您必须复制systemLayoutSizeFittingSize中的代码并将其放在systemLayoutSizeFitting(_:withHorizontalFittingPriority:verticalFittingPriority:)中。虽然这不是一个完美的解决方案/解决方法,但它至少为我们提供了一个可行的解决方案,但是很有可能在iOS 13退出Beta版并发布且不再需要之前,它可以更改。代码示例:

import UIKit

class FlickPhotoCell: UICollectionViewCell {

    func getCellSize(_ targetSize: CGSize) -> CGSize {
        return CGSize(width: 50, height: 200)
    }

    // Only this is called on iOS 12 and lower
    override func systemLayoutSizeFitting(_ targetSize: CGSize) -> CGSize {
        return self.getCellSize(targetSize)
    }

    // Only this is called on iOS 13 beta
    override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {
        return self.getCellSize(targetSize)
    }
}