我目前正在为UIView
和UIViewController
编写一个SwiftUI wrapper,我的目标是让这个 Package 器尊重UIView的大小和约束。
现在,我已经成功地从UIViewRepresentable
协议实现了sizeThatFits
方法,并且它按预期工作。以下是我当前的大小计算实现:
func sizeThatFits(_ width: CGFloat?, _ height: CGFloat?) -> CGSize? {
let intrinsicContentSize = self.intrinsicContentSize
let targetSize = CGSize(
width: width ?? intrinsicContentSize.width,
height: height ?? intrinsicContentSize.height
)
guard targetSize.width != UIView.noIntrinsicMetric, targetSize.height != UIView.noIntrinsicMetric else {
return nil
}
let horizontalPriority: UILayoutPriority = width == nil ? .defaultLow : .defaultHigh
let verticalPriority: UILayoutPriority = height == nil ? .defaultLow : .defaultHigh
return systemLayoutSizeFitting(
targetSize,
withHorizontalFittingPriority: horizontalPriority,
verticalFittingPriority: verticalPriority
)
}
但是,这种方法仅从iOS 16开始可用。我的目标是在所有iOS版本中提供相同的功能。
任何关于如何实现这一目标的建议或想法将不胜感激。谢谢你!
我已经尝试了各种限制,内容压缩/拥抱优先级和fixedSize
,就像在这里回答类似问题时建议的那样,但我还没有取得令人满意的结果。
1条答案
按热度按时间nmpmafwu1#
经过大量的实验,我发现在计算视图的大小时,SwiftUI只引用
intrinsicContentSize
属性,这反过来又没有考虑到所需的大小(例如,对于UILabel它只取决于文本),因此没有简单的方法来正确地将视图的大小调整到所需的大小,同时考虑其内容和约束。所以答案是没有继承和重写
intrinsicContentSize
是不可能的。P.S.我设法找到了一些hacks,并使用视图 Package 器here获得了所需的结果。
我不能在这里提供详细的代码示例,因为它非常大(多个类和结构)。