SwiftUI框架大小

时间:2019-06-17 05:43:15

标签: swift swiftui

如何在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,在这种情况下将无法使用。

2 个答案:

答案 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会填满整个屏幕)。

Drawing in UIViewRepresentable

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()
    }
}