SwiftUI中如何通过onTapGesture同时获取本地与全局点击位置?
解决方案:同时获取SwiftUI点击的本地与全局位置,及视图原点坐标
你不需要在两个onTapGesture之间二选一,有两种简单的方式实现需求:
方法一:在单个手势中转换坐标
利用视图的convert(_:from:)方法,可以在同一个onTapGesture里将本地位置转换为全局位置(或反之),进而计算视图的全局原点:
YourCustomView() .onTapGesture { localLocation in // 输出点击的本地位置 print("Local location: \(localLocation)") // 将本地位置转换为全局坐标系下的位置 let globalLocation = self.convert(localLocation, from: .local) print("Global location: \(globalLocation)") // 计算视图的全局原点坐标:全局点击位置 - 本地点击位置 let viewGlobalOrigin = CGPoint( x: globalLocation.x - localLocation.x, y: globalLocation.y - localLocation.y ) print("View global origin: \(viewGlobalOrigin)") }
方法二:用GeometryReader直接获取视图全局坐标
如果不需要依赖点击动作,直接通过GeometryReader可以拿到视图在全局坐标系下的完整frame,包括原点坐标,这是更直接的方式:
GeometryReader { geometryProxy in YourCustomView() .onAppear { // 获取视图在全局坐标系下的frame,直接拿到原点 let viewGlobalFrame = geometryProxy.frame(in: .global) print("View global origin: \(viewGlobalFrame.origin)") print("View size: \(viewGlobalFrame.size)") // 和你已知的尺寸验证 } .onTapGesture { localLocation in // 同样可以转换点击位置到全局坐标系 let globalTapLocation = geometryProxy.convert(localLocation, from: .local) print("Local tap: \(localLocation), Global tap: \(globalTapLocation)") } }
说明
- 方法一适合需要在点击时同时获取两种位置并计算原点的场景;
- 方法二更高效,无需等待点击,直接在视图出现时就能拿到全局原点坐标,完全满足你已知尺寸求原点的需求。
内容的提问来源于stack exchange,提问作者viedev
相关产品推荐
相关产品推荐

