Орбитальное вращение и преобразование UIImageView - PullRequest
2 голосов
/ 02 августа 2011

У меня есть круг, который вращается вокруг центра моего взгляда. Он постоянно вращается на 360 градусов. Это прекрасно работает, используя мой следующий код:

-(void) rotateGear: (UIImageView*) view angle:(int)angle arc:(float)arc
{
    float x1 = view.frame.origin.x + view.frame.size.width/2;
    float y1 = view.frame.origin.y + view.frame.size.height/2; 
    float radius = sqrtf(powf(160.0f - x1 ,2.0f) + powf(240.0f - y1, 2.0f));

    float x = 160.0f + radius * (cos(arc + M_PI + (angle * (M_PI / 180.0f))));
    float y = 240.0f + radius * (sin(arc + M_PI + (angle * (M_PI / 180.0f))));

    view.frame = CGRectMake(x - view.frame.size.width/2, y - view.frame.size.height/2, view.image.size.width, view.image.size.height);
}

Приведенный выше код вычисляет новую позицию на основе переданных параметров и перемещает изображение в новое местоположение, создавая впечатление, что оно движется в идеальном отношении к центру основного вида. Все отлично работает.

Однако я хочу, чтобы вид / сфера, которая вращается вокруг центра, также вращалась при вращении. В другом таймере я пытаюсь:

littleGear.transform = 
        CGAffineTransformRotate(CGAffineTransformIdentity, M_PI * (angle) / 180.0);

Все сходит с ума. Шар начинает переворачиваться, переворачиваться, складываться и изгибаться по всему экрану. Если я удаляю первый код, орбитальное вращение, оно работает нормально - оно отлично вращается на месте.

По сути, они оба работают нормально, пока не объединены, а затем все сводится с ума. Мое первое предположение состоит в том, что матрица заполняется всеми вращениями, но я не уверен, как ее решить. Есть идеи?

Ответы [ 2 ]

1 голос
/ 03 августа 2011

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

В вашем случае, поскольку вращающаяся шестерня в основном просто меняет свое положение, вы можете установить центр шестерни вместо рамы - таким образом, все свойства вида должны оставаться в согласованном состоянии:

-(void) rotateGear: (UIImageView*) view angle:(int)angle arc:(float)arc
{
    ...    
    view.center = CGPointMake(x, y);
}

PS, если вы хотите изменитьа также размер представления - измените его свойство bounds вместо frame

0 голосов
/ 03 августа 2011

Полагаю, что это улучшилось бы, если бы вы также сделали орбитальное вращение посредством преобразования.

В данном случае вы ищете преобразование перевода:

CGAffineTransform CGAffineTransformMakeTranslation (
  CGFloat tx,
  CGFloat ty
);

, который вы можете использовать вместо CGAffineTransformIdentity при настройке littleGear.transform:

 translationTransform = CGAffineTransformMakeTranslation(x, y);
 littleGear.transform = CGAffineTransformRotate(translationTransform, M_PI * (angle) / 180.0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...