我试图制作一个像这样的音量旋钮:
https://s-media-cache-ak0.pinimg.com/736x/29/b5/85/29b58559e3d8a09dcd7e1a47c700ca76.jpg
但我只想用一根手指,UIGestureRotate很棒,但只支持用两根手指旋转,而且我似乎找不到UIPan手势识别器旋转的解决方案,因为我想要它?有没有一种简单的方法可以在rotategesture中模拟第二个手指,还是我必须计算平移?
答案 0 :(得分:2)
如果忽略手势识别器并覆盖视图上的触摸处理程序,则可以使用数学来执行此操作。使用一点触发器,沿着一个轴(比如旋钮上的9点钟)取一个任意一个锚点,然后在旋钮中心用(0,0)平面上的触摸位置。假设您的锚点位于(-3,0),并且为了简单起见,您的触摸位于(-1,1)。取y的变化的arctan超过x的变化,在这种情况下,1/2的arctan,大约0.464弧度,或大约26.585度。您可以从定位点顺时针旋转旋钮26.6度(在这种情况下),让您的旋钮跟随您的触摸。在斯威夫特:
//Assume you have an anchor point "anchor" and a touch location "loc"
let radiansToRotate = atan2(loc.y - anchor.y, loc.x - anchor.x)
let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation")
rotateAnimation.fromValue = 0.0
rotateAnimation.toValue = radiansToRotate
rotateAnimation.duration = 1.0 //the longer the duration, the "heavier" your knob
旋转动画会使旋钮“跟随”你的手指,达到理想的效果。为了完整起见,atan2
是一个非常基本的形式,它是一个数学函数,可以保护您免受未定义的arctan值的影响。如果您的值波动很大,您可能需要担心旋转方向,所以您可以考虑使用关键帧动画(我会留给您)。