UIPan、UIRotation、UIPinch手势同时识别时视图旋转后拖拽异常求解
iOS多手势协同识别平移异常问题原理说明
核心问题根源
问题的本质是平移偏移量的参考坐标系与变换方法要求的坐标系不匹配。
具体原理拆解
- 原有代码中
panRecognizer.translation(in: self.view)获取的是父视图(未做任何变换的全局坐标系)下的偏移值,该值的x/y轴完全对齐屏幕的水平/垂直方向。 CGAffineTransform的translatedBy(x:y:)方法是基于目标视图自身的局部坐标系生效的:当视图已经被旋转、缩放之后,它的局部坐标系的x/y轴方向、单位长度都会和父视图坐标系产生差异。
举个实际场景:假设你的视图已经顺时针旋转了90度,此时视图自身的x轴已经和父视图的y轴正方向完全对齐。你在屏幕上水平向右拖拽(父视图x轴正方向),此时从父视图拿到的偏移量是deltaX=正数,deltaY=0,你把这个值直接传入translatedBy,就相当于让视图沿着自己的x轴(也就是父视图的y轴正方向)移动,自然就会出现水平拖拽、视图向上偏移的异常现象。
修复方案的逻辑
你修改为panRecognizer.translation(in: transformEditingView)之后,系统会自动把屏幕上的平移偏移量转换成目标视图自身局部坐标系下的对应值,此时传入translatedBy方法的x/y值和变换要求的坐标系完全匹配,拖拽方向就会和视图移动方向完全一致,异常自然消失。
相关代码对比
问题代码
let deltaX = panRecognizer.translation(in: self.view).x let deltaY = panRecognizer.translation(in: self.view).y return transform.translatedBy(x: deltaX, y: deltaY)
修复后代码
let deltaX = panRecognizer.translation(in: transformEditingView).x let deltaY = panRecognizer.translation(in: transformEditingView).y return transform.translatedBy(x: deltaX, y: deltaY)
内容的提问来源于stack exchange,提问作者Deepak Sharma
相关产品推荐
相关产品推荐

