Вращение UIImageView влияет на положение?

У меня есть UIImageView, который настроен на перемещение вверх и вниз по экрану со значением акселерометра, используя следующий код:

ship.center = CGPointMake(ship.center.x, ship.center.y+shipPosition.y);

Где shipPosition — это точка CGPoint, установленная в методе accelerometerDidAccelerate с использованием:

shipPosition.y = acceleration.x*60;

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

ship.transform = CGAffineTransformMakeRotation(shipPosition.y);

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

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

ИЗМЕНИТЬ:

Что действительно меня смущает, так это когда я меняю угол поворота с ускорения на положение корабля, используя:

ship.transform = CGAffineTransformMakeRotation(ship.center.y/10);

Когда я это делаю, корабль на самом деле вращается в зависимости от акселерометра, но не движется, что безумно, потому что изменение ship.center.y означает, что положение корабля меняется, но это не так!!


person Conor Taylor    schedule 11.01.2013    source источник


Ответы (2)


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

Свойство frame возвращает преобразованные координаты представления, если оно преобразовано, а не истинные координаты (на самом деле преобразованные являются истинными).

Цитата из документы:

Предупреждение. Если свойство преобразования не является преобразованием удостоверения, значение этого свойства не определено и поэтому его следует игнорировать.


Обновление/актуальный ответ:
На самом деле проблема в том,

shipPosition.y = acceleration.x*60;

Так как вы установили y pos в accelerometerDidAccelerate.
acceleration не запомнит свое старое значение. Поэтому, если вы переместите свое устройство, оно получит пик, а когда вы замедлитесь, оно снова замедлится.

Ваш корабль будет +/-60 при максимальной скорости ускорения, но будет равен 0, когда вы перестанете двигать свое устройство, а shipPosition.y будет равно 0.

person yinkou    schedule 11.01.2013
comment
Итак, вы говорите, что я применяю вращение, затем пишу ship.transform = CGAffineTransformIdentity;, а затем изменяю перемещение объекта? Я только что попробовал это там, объект теперь не двигается и не вращается. - person Conor Taylor; 11.01.2013
comment
Нет. Я предполагаю, что у вас есть игровой цикл или таймер, в котором вы применяете новые координаты и вращение. Это должно выглядеть так: 1. применить новые координаты 2. преобразовать. Новое должно выглядеть так: 1. применить идентичность 2. применить новые координаты 2. преобразовать. - person yinkou; 11.01.2013
comment
Да, у меня есть петля, и я сделал то, что вы только что сказали, но у меня возникает та же проблема, что и всегда, то есть изображение вращается, но не движется. - person Conor Taylor; 11.01.2013
comment
Я увеличил свой ответ после того, как понял, что вы используете движения устройства. - person yinkou; 11.01.2013
comment
Нет, потому что код прекрасно работает и без части трансформации! Если я просто использую его без вращения, он работает точно так, как ожидалось! Что-то странное происходит с трансформацией - person Conor Taylor; 11.01.2013

CGAffineTransformMakeRotation ожидает угол в радианах, а не в градусах.

1 радиан = M_PI / 180,0 градусов

person rjobidon    schedule 11.01.2013
comment
Правда, в конце концов, это просто числа, он не может их различить. Если он превышает 2 пи радиана, он просто снова возвращается по кругу, как если бы он превышал 360 градусов. это не имеет значения - person Conor Taylor; 11.01.2013