2013-12-03 2 views
7

Я разрабатываю приложение, которое supports portrait and landscape modes. Я использую auto layout to arrange my views. Поскольку я читал много сообщений, я понял, что разработчики обычно используют один из следующих подходов.Ориентация автоповорота и устройства

1. Первый подход:

Реализовать UIViewController:updateConstraints метод и обновления ограничений в соответствии с ориентацией устройства.

2. Второй подход:

Реализовать UIViewController:viewWillLayoutSubviews метод и обновления ограничений в соответствии с ориентацией устройства.

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

ответ

6

Я хотел бы использовать метод этого UIViewController в:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;

, который вызывается при вращении, и вызвать -setNeedsUpdateConstraints оттуда. Если вам нужно сделать дополнительные расчеты или управлять contrainsts добавить

- (void)updateViewConstraints 
{ 
    [super updateViewConstraints]; 
    // do calculations if needed, like set constants 
} 
+0

Я считаю, что нет необходимости вычислять ограничения в методе willAnimateRotationToInterfaceOrientation, потому что это можно сделать в updateViewConstraints, проверив текущую ориентацию устройства. – rokridi

+1

Возможно, мой ответ не ясен, я имел в виду, что вычисления должны выполняться в методе updateViewContraints. – Fr4ncis

+0

Я подтверждаю, что вычисления должны выполняться в методе updateViewContraints. Но когда я вызываю метод setNeedsUpdateConstraints в методе willAnimateRotationToInterfaceOrientation, я понимаю, что updateViewConstraints вызывается более одного раза. – rokridi

5

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

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

Использование viewWillLayoutSubviews не требуется. Способы автоматической компоновки: updateViewConstraints (для контроллера вида) и updateConstraints (в представлениях).

+3

Но иногда настройка ограничений недостаточна, поскольку макет может полностью измениться при переключении с ландшафта на портрет и наоборот. – rokridi

+1

, в этом случае вам понадобится один из способов ограничения обновлений, как описано в ответе выше, на @ Fr4ncis –

+0

только что увидел, что это произошло. Это может быть полезно для вас: http://stackoverflow.com/questions/17772922/can-i-use-autolayout-to-provide-different-constraints-for-landscape-and-portrait –

1

Я считаю, что лучший подход заключается в обновлении ограничений в -(void)updateViewConstraints путем проверки ориентации устройства. Нет необходимости звонить setNeedsUpdateConstraints в willAnimateRotationToInterfaceOrientation, потому что он автоматически вызывается iOs при изменении ориентации устройства. Спасибо всем за большие усилия.

0

для ios8 +

Из документации:

- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection 
      withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 

Стандартный контроллер представления может использовать этот метод для изменения ограничения на взглядах, которыми он управляет.

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