如何在UIViewRepresentable中获得框架大小?
我有一个简单的DrawView类,可以绘制一些东西,我想与SwiftUI集成。如果我将帧大小硬编码为640x480,则此代码有效,但是是否可以知道ContentView的当前帧大小?
struct ContentView: View {
var body: some View {
SwiftDrawView()
}
}
struct SwiftDrawView: UIViewRepresentable {
func makeUIView(context: Context) -> DrawView {
DrawView(frame:CGRect(x: 0, y: 0, width: 640, height: 480))
}
....
}
Apple教程始终使用.zero,在这种情况下将无法使用。
答案 0 :(得分:1)
struct ContentView: View {
var body: some View {
GeometryReader { proxy in
SwiftDrawView(frame: proxy.frame(in: .local))
}
}
}
struct SwiftDrawView: UIViewRepresentable {
let frame: CGRect
func makeUIView(context: Context) -> DrawView {
DrawView(frame:frame)
}
....
}
答案 1 :(得分:0)
在UIView创建时(即在makeUIView中),框架并不重要,因为将根据容器视图中的最终布局调整构造后的视图的大小,并将生成的框架传递到UIView.draw中。
这是完整的示例(Xcode 11.1)和预览(注意:如果在下面的示例中删除VStack,则DrawView会填满整个屏幕)。
import SwiftUI
import UIKit
class DrawView : UIView {
override func draw(_ rect: CGRect) {
let path = UIBezierPath(ovalIn: rect)
UIColor.green.setFill()
path.fill()
}
}
struct SwiftDrawView: UIViewRepresentable {
typealias UIViewType = DrawView
func makeUIView(context: Context) -> DrawView {
DrawView()
}
func updateUIView(_ uiView: DrawView, context: UIViewRepresentableContext<SwiftDrawView>) {
// change here some DrawView properties if needed, eg. color
}
}
struct ContentView: View {
var body: some View {
VStack {
SwiftDrawView()
Text("SwiftUI native")
}
.edgesIgnoringSafeArea(.all)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}