如何区分NSMagnificationGesture的捏合与放大操作并解决类型转换报错
问题原因
- 报错核心是你直接将
NSMagnificationGestureRecognizer实例pinchZoomOut和Double类型的数值做比较,手势对象本身不是数值,需要读取它的magnification属性获取缩放比例(该属性为Double类型) - 原有判断逻辑不符合需求:
NSMagnificationGesture的magnification属性大于1代表放大手势,小于1代表捏合缩小手势,你写的>0.3的判断会把放大手势也包含进去,会出现两种手势都触发方法的问题。
解决方案
推荐直接复用Action的sender参数,不需要额外调用Outlet,代码更简洁:
@IBAction func pinchGesture(_ sender: Any) { // 先把sender转成正确的手势类型 guard let gesture = sender as? NSMagnificationGestureRecognizer else { return } // 捏合缩小判断:magnification小于1,阈值可自行调整,数值越小要求捏合幅度越大 if gesture.magnification < 0.7 { doPinch() } }
如果你一定要用已有的OutletpinchZoomOut,写法如下:
@IBAction func pinchGesture(_ sender: Any) { // 读取magnification属性获取缩放数值再做比较 if pinchZoomOut.magnification < 0.7 { doPinch() } }
如果需要避免手势过程中多次触发,只想在捏合动作结束时调用一次,可以补充手势状态判断:
@IBAction func pinchGesture(_ sender: Any) { guard let gesture = sender as? NSMagnificationGestureRecognizer else { return } if gesture.state == .ended, gesture.magnification < 0.7 { doPinch() } }
内容的提问来源于stack exchange,提问作者moonmonkey
相关产品推荐
相关产品推荐

