在iPhone上,如何使用手指触摸在中心点周围实现旋转图像?
就像滚轮一样,如果你把手指放在iPhone屏幕上,然后突然移动,那么图像就像轮子一样绕中心点旋转,过了一会儿,它变得越来越慢,最后停止。
谁可以帮忙提供一些代码(Object-C)或一些建议?
答案 0 :(得分:2)
我昨天正在使用“旋转瓶子”-app。在窗口上我有一个带有瓶子的ImageView,它可以响应触摸并旋转用户滑动手指的方式。我在触摸事件(TouchesBegan,Touchesoved,TouchesEnd)期间努力让我的ImageView旋转。我在TouchesMoved中使用此代码来找出旋转图像的角度。
public override void TouchesMoved (NSSet touches, UIEvent evt)
{
PointF pt = (touches.AnyObject as UITouch).LocationInView(this);
float x = pt.X - this.Center.X;
float y = pt.Y - this.Center.Y;
double ang = Math.Atan2(x,y);
// yada yada, rotate image using this.Transform
}
这很重要! 当ImageView旋转时,即使是x& y坐标变化。因此,始终触摸同一区域会在pt和prePt点中给出不同的值。经过一番思考,googeling和阅读,我想出了一个简单的问题解决方案。 ImageView的“超级视图”属性。
PointF pt = (touches.AnyObject as UITouch).LocationInView(this.SuperView);
进行了那么小的改动使得它变得更加容易,我不能使用UITouch-metohs LocationInView和PreviousLocationInView并获得正确的x& y坐标。她是我代码的一部分。
float deltaAngle;
public override void TouchesMoved (NSSet touches, UIEvent evt)
{
PointF pt = (touches.AnyObject as UITouch).LocationInView(this.Superview);
float x = pt.X - this.Center.X;
float y = pt.Y - this.Center.Y;
float ang = float.Parse(Math.Atan2(dx,dy).ToString());
//do the rotation
if (deltaAngle == 0.0) {
deltaAngle = ang;
}
else
{
float angleDif = deltaAngle - ang;
this.Transform = CGAffineTransform.MakeRotation(angleDif);
}
}
希望能帮助别人花几个小时来弄清楚怎么弄乱旋转瓶子! :)
答案 1 :(得分:1)
我会使用仿射变换 - 你可以使用transform属性为任何图层或UI元素指定转换。
您可以使用CGAffineTransform CGAffineTransformMakeRotation( CGFloat angle)
创建旋转变换,它将返回旋转元素的变换。默认旋转应该在中心点附近。
请注意,旋转限制为360度,所以如果你想要旋转超过那个(比如通过720度)的东西 - 你必须将旋转分成几个序列。
您可能会发现this SO article也很有用。
答案 2 :(得分:1)
视图或图层的transform属性可用于旋转其中显示的图像。就旋转部分而言,您只需使用touchesBegan,touchesMoved和touchesEnded跟踪视图中触摸的位置和移动。
使用触摸更新之间的距离和时间来计算速度,并使用它来设置旋转速度。一旦开始旋转图像,定期更新位置(可能使用NSTimer),并将旋转速度降低一些常数。