2013-05-17 4 views
1

Я обновляю свое приложение для iPhone на экране большего размера iPhone 5, и, похоже, проблема связана с animateWithDuration:. Прежде чем я включил автоматическое отключение, элементы интерфейса немного переместились бы вверх по экрану, когда UITextField стал первым ответчиком и вернется в исходное положение, когда UITextField потеряет свой первый статус ответчика. Теперь они просто беспорядочно взлетают и с экрана, и я понятия не имею, почему. Я переместить объекты с кодом ниже (и это работало с autolayout выключен):AutoLayout и animateWithDuration проблемы

[UIView animateWithDuration:.25 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
    int offset = 160; 
    [object1 setFrame:CGRectMake(0, -offset, object1.frame.size.width, object1.frame.size.height)]; 
    [object2 setFrame:CGRectMake(object2.frame.origin.x, object2.frame.origin.y-offset, object2.frame.size.width, object2.frame.size.height)]; 
    [object3 setFrame:CGRectMake(object3.frame.origin.x, object3.frame.origin.y-offset, object3.frame.size.width, object3.frame.size.height)]; 
      } 
       completion:^(BOOL finished){}]; 

Есть ли у него что-то делать с попытками переместить объекты на константу? Даже когда я установил offset в 0, все объекты все еще летают с экрана. Я попытался определить, какой экран имеет устройство, и перемещать объекты на разные суммы, но это тоже не сработало. У кого-нибудь есть идеи?

Заранее благодарен!

+1

autolayout и frame animation конфликтуют друг с другом. Я рассматриваю это как самую большую ошибку IOS 6 (из многих). Для решений см. Мою книгу: http://www.apeth.com/iOSBook/ch17.html#_animation_and_autolayout – matt

ответ

2

При использовании автоматического макета, если только эти объекты не были добавлены вручную в представление с помощью translatesAutoresizingMaskIntoConstraints = YES, автоопределение часто препятствует попыткам анимировать, изменяя рамку. Если есть что-то на месте, которое приведет к повторному использованию ограничений, объекты вернутся туда, где должны быть ограничения, которые они должны быть, переопределяя ваши попытки настроить свои свойства frame.

Если анимировать движение объектов, как это при использовании autolayout, вы должны либо (а) создать IBOutlet для их верхнего ограничения (если настройки y, регулируя x тоже, вы должны использовать ведущее ограничение также), а затем измените свойство constant этого ограничения, а затем вызовите layoutIfNeeded из блока анимации; или (b) удалить ограничения и создать новые. (Я вообще первый.)

Смотрите последнюю часть this answer для примера того, как создать IBOutlet для ограничения, а затем изменить constant свойства в анимации блоке.