先说下背景:
需求是要完成一个界面,在这个界面中有一张环形的调色盘图片,要在这张环形调色盘外面添加一个带有箭头的手柄图片,要求这张带有箭头的手柄图片随手指的拖动围着圆环调色盘旋转,并且这张手柄的箭头要时刻指向圆心。
在实现过程中出现的问题:
随着手指着圆环上的拖动,手柄图片可以随着手指围着圆环调色盘旋转,手柄图片的箭头也能时刻指向圆环的圆心,但每当图片离开圆环的上下左右四个点的位置时,就会向外扩张(也就是手柄图片离开0、π/2、π、3π/2这四个点时,运动的半径就会变大)。
解决思路及解决办法
首先,在屏幕上以圆盘的中心点为圆心,圆盘的宽度为半径,画一个内圆,再在屏幕上一圆盘的中心点为圆心,以圆盘宽度与手柄宽度之和为半径,画一个外圆,手指在屏幕上滑动时,判断
touch
的location
是否在外圆内而不在内圆内。监听手指在手机屏幕上的移动来获取手指到圆心到0°所构成的角度,再根据一个方法根据touch
的角度(半径是圆环调色盘宽度与手柄图片宽度之和的一半)计算出手柄图片的结果坐标,重新设置手柄图片的位置。
如果不让手柄图片发生形变,只改变手柄图片的位置,图片在随手指在圆环上移动时,不会向外扩,但是只要加上
CGAffineTransformMakeRotation(angle)
,手柄图片在移动的过程中就会向外扩大,通过设置圆环图片和手柄图片的背景颜色后发现:!!!在手柄图片发生形变的同时,手柄图片的宽高也会发生改变!!!,这才突然想起来,当通过transform改变图片的旋转角度时,其实系统以重新帮我们绘制了一张新的图片
所以,只要在修改图片的transform之前,提前设置好手柄图片的移动半径,而不是在移动的同时计算出手柄图片移动路径的半径,就能保证手柄图片不会向外扩。