如何设置UIViewRepresentable的大小?

时间:2020-03-26 13:24:35

标签: ios swift swiftui

我的想法是这样的:无论SwiftUI尚未提供什么,都可以使用UIViewRepresentable来解决。因此,我着手为TTTAttributedLabel创建一个UIViewRepresentable。

但是API中缺少一些基本的东西,或者我缺少一些基本的东西:如何设置UIViewRepresentable的“内部内容大小”?

就像SwiftUI Text一样,我希望我的组件能够考虑到其容器的大小将其自身设置为一定的大小。

我的第一个想法是使用固有内容大小,所以我创建了这个:


class SizeRepresentableView: UILabel {
    override init(frame: CGRect) {
        super.init(frame: CGRect.zero)
        text="hello"
        backgroundColor = UIColor.systemYellow
    }

    override var intrinsicContentSize: CGSize {
        return CGSize(width: 100, height: 100)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

struct SizeRepresentable: UIViewRepresentable {
    func updateUIView(_ uiView: SizeRepresentableView, context: Context) {
    }

    typealias UIViewType = SizeRepresentableView

    func makeUIView(context: UIViewRepresentableContext<SizeRepresentable>) -> SizeRepresentableView {
        let v = SizeRepresentableView(frame: CGRect.zero)
        return v
    }
}

struct SizeRepresentableTest: View {
    var body: some View {
        VStack {
            SizeRepresentable()
            Spacer()
        }
    }
}

struct SizeRepresentable_Previews: PreviewProvider {
    static var previews: some View {
        SizeRepresentableTest()
    }
}

但这不起作用。标签占用了所有空间,间隔符则没有。使用SwiftUI Text而不是我的SizeRepresentable时,标签会整齐地排列在顶部,间隔符会占据所有空间。

我似乎找不到任何有关如何布局UIViewRepresentable的文档。

解决这个问题的方法是什么?

1 个答案:

答案 0 :(得分:1)

请参阅:How does UIViewRepresentable size itself in relation to the UIKit control inside it?

struct SizeRepresentableTest: View {
    var body: some View {
        VStack {
            SizeRepresentable().fixedSize()
            Spacer()
        }
    }
}