Как автоматически поворачивать изображение вокруг центральной точки касанием пальца - PullRequest
0 голосов
/ 13 июля 2009

На iPhone, как реализовать вращение изображения вокруг центральной точки с помощью касания пальцем?

Точно так же, как колесо, если вы положите палец на экран iPhone, а затем внезапно начнете двигаться, тогда изображение станет вращаться вокруг центральной точки, как колесо, через некоторое время оно будет становиться все медленнее, наконец остановится.

Кто может помочь дать некоторые кусочки кодов (Object-C) или некоторые предложить?

Ответы [ 3 ]

2 голосов
/ 02 августа 2011

Я вчера работал с приложением "закрутить бутылку". В окне у меня есть ImageView с бутылкой, которая должна реагировать на прикосновения и вращать, как пользователь проводит пальцем. Я изо всех сил пытался заставить мой ImageView вращаться во время сенсорных событий (TouchesBegan, Touchesoved, TouchesEnd). Я использовал этот код в 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. Подумав, погуглив и почитав, я нашел простое решение проблемы. «SuperView» - свойство 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 голос
/ 13 июля 2009

Свойство transform вида или слоя можно использовать для поворота изображения, отображаемого внутри. Что касается вращающейся части, вы просто отслеживаете местоположение и движение касаний в вашем представлении с помощью touchSbegan, touchesMoved и touchesEnded.

Используйте расстояние и время между обновлениями касаний, чтобы рассчитать скорость, и используйте ее для установки скорости вращения. Как только вы начнете вращать изображение, периодически обновляйте положение (возможно, с помощью NSTimer) и уменьшайте скорость вращения на некоторую постоянную.

1 голос
/ 13 июля 2009

Я бы использовал аффинные преобразования - вы можете назначить преобразование любому слою или элементу пользовательского интерфейса, используя свойство transform.

Вы можете создать преобразование вращения, используя CGAffineTransform CGAffineTransformMakeRotation( CGFloat angle), которое будет возвращать преобразование, вращающее элемент. Поворот по умолчанию должен быть вокруг центральной точки.

Имейте в виду, что вращение ограничено 360 градусами, поэтому, если вы хотите повернуть нечто большее, чем это (скажем, на 720 градусов), вам нужно разбить вращение на несколько последовательностей.

Вы можете найти эту статью SO также полезной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...