如何确定SwiftUI视图的框架大小

时间:2019-08-02 09:50:16

标签: swiftui

我有一个显示UIImage的SwiftUI视图。如何确定显示的视图的框架?

我想确定用户点击的图像上的颜色。我知道原始图像的大小,但是无法确定如何确定显示的帧的实际大小。

例如,使用3024 x 4032的图片,代码为

struct PhotoImage: View {
    var image: UIImage
    @State private var gest: DragGesture = DragGesture(minimumDistance: 0, coordinateSpace: .local)
    var body: some View {
        GeometryReader {
            geometry in
                Image(uiImage: self.image )
                    .resizable()
                    .frame(width: 500, height: 400, alignment: .center)
                    .aspectRatio(contentMode: .fit)
                    .gesture(self.gest
                    .onEnded({ (endGesture) in
                        let frame = geometry.frame(in: CoordinateSpace.local)
                        let size = geometry.size
                        print("Frame: \(frame)")
                        print("Geometry size: \(size)")
                        print("Image size: \(self.image.size)")
                        print("Location: \(endGesture.location)")
                       }))
        }
    }
}  

调试显示帧和几何尺寸为1194x745。手势位置显示图像视图的尺寸为500x 400。

如果我没有设置框架尺寸,而是使用AspectFill,则几何尺寸是正确的。但是,这对我的需求不利,因为图像的顶部和底部被剪切了。

1 个答案:

答案 0 :(得分:0)

您的 GeometryReader 不是读取图像的大小,而是读取可用/声称的所有空间。 您可以通过将其添加到背景或覆盖层来确保几何阅读器在框架和几何大小中返回预期的 500x400。

这是修改后的版本:

struct PhotoImage: View {
    var image: UIImage
    @State private var gest: DragGesture = DragGesture(minimumDistance: 0, coordinateSpace: .local)
    var body: some View {
        Image(uiImage: self.image )
            .resizable()
            .frame(width: 500, height: 400, alignment: .center)
            .aspectRatio(contentMode: .fit)
            .overlay(
                GeometryReader { geometry in
                    Color.clear
                        .contentShape(Rectangle())
                        .gesture(
                            self.gest
                                .onEnded({ (endGesture) in
                                    let frame = geometry.frame(in: CoordinateSpace.local)
                                    let size = geometry.size
                                    print("Frame: \(frame)")
                                    print("Geometry size: \(size)")
                                    print("Image size: \(self.image.size)")
                                    print("Location: \(endGesture.location)")
                                })
                        )
                }
            )
    }
}