2013-09-17 2 views
0

У меня есть кнопка (на самом деле четыре из них) в определенной позиции, которую я хочу вращать и переводить одновременно, поэтому я решил использовать CGAffineTransformMake и предоставить матрицу преобразования.CGAffineTransformMake меняет свой объект перед преобразованием

Однако я заметил, что, если я хочу перевести x = -100, например, кнопка сначала будет мгновенно сдвинута x = +200, а затем будет анимировать ее преобразование в x = -100.

Есть ли способ сделать это без этого перехода в противоположном направлении?

CGAffineTransform transform = CGAffineTransformMake(-1, 0, 0, -1, -100, 0); // Spins 180° and translates 

[UIView beginAnimations:@"Show Menu" context:nil]; 
[UIView setAnimationDuration:2.4]; 
_menuButton1.transform = transform; 
[_menuButton1 setAlpha:1.0]; 
[UIView commitAnimations]; 
+0

Сначала используйте метод блока анимации UIView. Во-вторых, используете ли вы AutoLayout в своем представлении? – Fogmeister

ответ

2

Вы не должны использовать этот метод анимации. Apple не поддерживает Apple после iOS 4.0. https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/occ/clm/UIView/beginAnimations:context:

Предпочтительным является метод ...

[UIView animateWithDelay:0.0 
       duration:2.4 
       options:0 
       animations:^() { 
        _menuButton1.transform = CGAffineTransformMake(-1, 0, 0, -1, -100, 0); 
        _menuButton1.alpha = 1.0; 
       } 
       completion:nil]; 

будет редактировать свой ответ, когда вы отвечаете на мой комментарий.

ОК, причиной этого сдвига является то, что вы пытаетесь перевести представление, используя AutoLayout, чтобы ограничить его.

Я не знаю, почему это вызывает проблему, но это так.

Ваши два варианта крепления его в ...

  1. Поворот AutoLayout, а затем вы код будет работать.
  2. Включите AutoLayout и узнайте, как оживить ограничения.

Для второго варианта я могу порекомендовать книгу «iOS6 by Tutorials» Рэя Вендерлиха и его команды.

http://www.raywenderlich.com/store/ios-6-by-tutorials

Я использовал это, чтобы узнать, как сделать AutoLayout правильно.

+0

Почему я должен использовать этот метод? Я попытался, и он сдвинул кнопку так же, как раньше. Кроме того, вы заменили задержку и продолжительность. – Guilherme

+0

Да, так и будет. Ваш метод - это старый метод анимации. Документы говорят: «Использование этого метода не рекомендуется после iOS 4.0». Проблема со сдвигом, вероятно, связана с его использованием с AutoLayout. Как я спросил в комментарии ... вы используете AutoLayout в этом представлении? – Fogmeister

+0

Да, я использую автозапуск. – Guilherme

2

Вы можете начать с одного из преобразований, скажем, перевод:

CGAffineTransform transform = CGAffineTransformMakeTranslation(-100.0f, 0.0f); 

И затем добавить поворот к нему:

transform = CGAffineTransformRotate(transform, (float)M_PI_2); 

И, наконец, установить это преобразование к transform собственности вашего вида.

+1

Проблема заключается не в том, что преобразование неверно. Проблема в том, что анимация неверна.Вы просто создаете одно и то же преобразование в двух строках вместо одного. Я видел этот «сдвиг», прежде чем использовать анимацию, подобную этой, с включенным автозапуском. Это то, что я подозреваю, проблема. Просто не получив ответа об этом от айзера. – Fogmeister

+1

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

+0

На самом деле, да, я предпочитаю писать 'NSPredicates', используя' NSCompoundPredicate', чтобы объединить их. То же самое, предпочтение. – Fogmeister

Смежные вопросы