如何用手指触摸自动围绕中心点旋转图像

时间:2009-07-13 14:23:02

标签: iphone image rotation

在iPhone上,如何使用手指触摸在中心点周围实现旋转图像?

就像滚轮一样,如果你把手指放在iPhone屏幕上,然后突然移动,那么图像就像轮子一样绕中心点旋转,过了一会儿,它变得越来越慢,最后停止。

谁可以帮忙提供一些代码(Object-C)或一些建议?

3 个答案:

答案 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),并将旋转速度降低一些常数。