我在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时无法实现“自定义大小”单元格。
答案 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)
}
}