我如何让SwiftUI Package 器在所有iOS版本中都遵守UIView大小?

vq8itlhq  于 2023-06-04  发布在  Swift
关注(0)|答案(1)|浏览(182)

我目前正在为UIViewUIViewController编写一个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,就像在这里回答类似问题时建议的那样,但我还没有取得令人满意的结果。

nmpmafwu

nmpmafwu1#

经过大量的实验,我发现在计算视图的大小时,SwiftUI只引用intrinsicContentSize属性,这反过来又没有考虑到所需的大小(例如,对于UILabel它只取决于文本),因此没有简单的方法来正确地将视图的大小调整到所需的大小,同时考虑其内容和约束。
所以答案是没有继承和重写intrinsicContentSize是不可能的。
P.S.我设法找到了一些hacks,并使用视图 Package 器here获得了所需的结果。
我不能在这里提供详细的代码示例,因为它非常大(多个类和结构)。

相关问题