SwiftUI 获取 TextField 或任何视图的坐标

Posted

技术标签:

【中文标题】SwiftUI 获取 TextField 或任何视图的坐标【英文标题】:SwiftUI Get Coordinates of TextField or any View 【发布时间】:2020-04-22 00:39:44 【问题描述】:

我正在努力在 SwiftUI 中找到一种方法来获取 a 原点的 x,y 坐标 TextField(或任何视图)。我当然可以提供一个位置或偏移量来移动视图 但我似乎无法找到一种方法来获取对 TextField 的引用以获取它 坐标。

在 UIKit 中,我相信我会使用 myTextField.frame.origin.x

这是一个非常简单的例子:

struct ContentView: View 

    @State private var someNumber1 = "1000"
    @State private var someNumber2 = "2000"
    //bunch more

    @State private var enteredNumber = "Some Text at the Top"
    @State var value: CGFloat = 0

    var body: some View 
        ScrollView 
            VStack 
                Spacer()
                Text("\(enteredNumber)")
                Spacer()

                Group  //1
                    TextField("Placeholder", text: $someNumber1)
                        .keyboardType(.default)
                        .textFieldStyle(RoundedBorderTextFieldStyle())

                        //this does not work
                        .onTapGesture 
                            let aY = (textfieldreferencehere).frame.origin.y
                        

                    TextField("Placeholder", text: $someNumber2)
                        .keyboardType(.default)
                        .textFieldStyle(RoundedBorderTextFieldStyle())
               //group 1     

               //bunch more

                Button(action: 
                    self.enteredNumber = self.someNumber1
                    self.someNumber1 = ""
                    UIApplication.shared.endEditing()
                ) 
                    Text("Submit")
                
                .padding(.bottom, 50)

            //outer v
                .padding(.horizontal, 16)
                .padding(.top, 44)

        //Scrollview or Form
        .modifier(AdaptsToSoftwareKeyboard())
    

任何指导将不胜感激。 Xcode 11.4.1

【问题讨论】:

【参考方案1】:

这是一个如何读取特定视图坐标的演示(请参阅有用的 cmets inline)

struct DemoReadViewOrigin: View 

    @State private var someNumber1 = "1000"
    @State private var someNumber2 = "2000"
    //bunch more

    @State private var enteredNumber = "Some Text at the Top"
    @State var value: CGFloat = 0

    var body: some View 
        ScrollView 
            VStack 
                Spacer()
                Text("\(enteredNumber)")
                Spacer()

                Group  //1
                    TextField("Placeholder", text: $someNumber1)
                        .keyboardType(.default)
                        .textFieldStyle(RoundedBorderTextFieldStyle())
                        .background(GeometryReader  gp -> Color in
                            let rect = gp.frame(in: .named("OuterV")) // < in specific container
                            // let rect = gp.frame(in: .global) // < in window
                            // let rect = gp.frame(in: .local) // < own bounds
                            print("Origin: \(rect.origin)")
                            return Color.clear
                        )

                        //this does not work
                        .onTapGesture 
                        

                    TextField("Placeholder", text: $someNumber2)
                        .keyboardType(.default)
                        .textFieldStyle(RoundedBorderTextFieldStyle())
               //group 1

               //bunch more

                Button(action: 
                    self.enteredNumber = self.someNumber1
                    self.someNumber1 = ""
//                    UIApplication.shared.endEditing()
                ) 
                    Text("Submit")
                
                .padding(.bottom, 50)

            //outer v
                .coordinateSpace(name: "OuterV") // << declare coord space
                .padding(.horizontal, 16)
                .padding(.top, 44)

        //Scrollview or Form
//        .modifier(AdaptsToSoftwareKeyboard())
    

【讨论】:

这是一个非常好的解决方案,因为它不依赖于偏好键(就像其他类似主题的解决方案一样),而且使用基本的 Swift/SwiftUI 概念,因此希望破坏的可能性非常低。感谢分享

以上是关于SwiftUI 获取 TextField 或任何视图的坐标的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUi 有没有办法在 TextField 中获取文本

SwiftUI 如何获取对 List 内编辑 Textfield 的参考?

_PathPoint 类和 _PointQueue 类错误,不使用任何 pod。只需点击swiftui中的textField?

SwiftUI TextField 强制小写

SwiftUI - 动态文本的本地化

SwiftUI 从 ViewModel 预填充 TextField