如何在小型 iPhone 上捕获点击坐标并将其渲染在大型 iPhone 上的相同相对位置?

How to capture a tap coordinate on a small iPhone and render it in the same relative position on a large iPhone?

提问人:Westley 提问时间:7/2/2023 最后编辑:Westley 更新时间:7/2/2023 访问量:52

问:

我正在构建一个应用程序,它基本上是篮球队的投篮图表。我有一个篮球场的图像,用户点击球场,就会出现一个点。我得到点击坐标并渲染一个点。很简单。

我被挂断的地方是,我最终需要将这些点击准确地呈现在手机场上的位置,这些点击在不同设备上记录了它们。因此,例如,iPad 和 iPhone 14 Pro Max 需要在罚球线上显示与录制它的 iPhone SE 相同的位置。

我尝试根据图像尺寸将 x/y 坐标转换为分数,但这不起作用,因为设备的纵横比不同。

这可能是一个简单的问题,但我被困住了!

编辑:

这是我的 VC 中的简单代码:

override func viewDidLoad() {
        super.viewDidLoad()
        
        // Add gesture recognizer
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
        imageView.isUserInteractionEnabled = true
        imageView.addGestureRecognizer(tapGestureRecognizer)
        
        // I don't add this in until the second launch, after I tap and get the % below
//        let dotImage = UIImageView(image: UIImage(named: "playDot"))
//        dotImage.frame.origin = CGPoint(x: self.imageView.frame.size.width * 0.5007496251874063, y: self.imageView.frame.size.height * 0.20666666666666667)
//                self.imageView.addSubview(dotImage)
    }
    
    @objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer) {
        
        let touchPoint = tapGestureRecognizer.location(in: self.imageView)
        
        let dotImage = UIImageView(image: UIImage(named: "playDot"))
        dotImage.center = touchPoint
        self.imageView.addSubview(dotImage)
        
        print("Tap dot x%:\(touchPoint.x / self.imageView.frame.size.width), y%: \(touchPoint.y / self.imageView.frame.size.height)")
    }

我点击一次后,点显示如下:

enter image description here

这是控制台输出:

点击点 x%:0.5007496251874063, y%: 0.2066666666666667

因此,我取消了上面的初始图像放置代码的注释,并在同一模拟器上再次运行该应用程序:

enter image description here

我希望它在多个设备上处于完全相同的位置,但我什至无法将其正确用于同一设备:/

Swift iPhone iPad 坐标 兼容性

评论

0赞 matt 7/2/2023
请记住,图像视图的尺寸、图像视图的内容模式以及原始图像的尺寸都至关重要。之后,您的问题将成为拖动裁剪问题的更简单版本。
0赞 Westley 7/2/2023
@matt感谢您的评论。我用于 bg 的图像是 1336x662。图像视图的内容模式是纵横比拟合。
0赞 HangarRash 7/2/2023
永远不要依赖 中视图的大小。试试看。viewDidLoadviewDidLayoutSubviews

答: 暂无答案