假设你有一个 UIKit 视图想要决定它自己的大小(通过 internalContentSize 或布局约束,大小可能会改变)。例如:
/// Some UIKit view that wants to have a specific size
class YellowBoxUIKitView : UIView {
init() {
super.init(frame: .zero)
self.backgroundColor = .yellow
}
required init?(coder: NSCoder) {
fatalError("init(coder:) is not supported")
}
override var intrinsicContentSize: CGSize {
return CGSize(width: 100, height: 100)
}
}
Run Code Online (Sandbox Code Playgroud)
如何将其包装为 SwiftUI UIViewRepresentable 并使其自动将 UIView 大小传递给 SwiftUI?
struct YellowBoxView : UIViewRepresentable {
func makeUIView(context: Context) -> YellowBoxUIKitView {
// TODO: How do you pass the size from UIKit up to SwiftUI?
YellowBoxUIKitView()
}
func updateUIView(_ uiView: YellowBoxUIKitView, context: Context) {
}
}
Run Code Online (Sandbox Code Playgroud)
SwiftUI 不考虑 UIView 的大小,只是给它最大可能的宽度/高度。
可运行示例:SizedUIViewRepresentableView
这里有一个关于 UITextView 的类似问题:Update UIViewRepresentable size from UIKit in SwiftUI
Asp*_*eri 11
解决方案是为代表设置明确的压缩/拥抱优先级 UIView
使用 Xcode 11.4 / iOS 13.4 测试
struct YellowBoxView : UIViewRepresentable {
func makeUIView(context: Context) -> YellowBoxUIKitView {
let view = YellowBoxUIKitView()
view.setContentHuggingPriority(.required, for: .horizontal) // << here !!
view.setContentHuggingPriority(.required, for: .vertical)
// the same for compression if needed
return view
}
func updateUIView(_ uiView: YellowBoxUIKitView, context: Context) {
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3675 次 |
最近记录: |