Могу ли я использовать автозапуск, чтобы обеспечить различные ограничения для пейзажной и портретной ориентации?

Можно ли изменить ограничения при повороте устройства? Как это может быть достигнуто?

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

Если это невозможно, как еще я могу выполнить этот макет?

Я строю свои представления и ограничения в коде и не использую конструктор интерфейса.

5 Solutions collect form web for “Могу ли я использовать автозапуск, чтобы обеспечить различные ограничения для пейзажной и портретной ориентации?”

Изменить. Используя новую концепцию классов классов, представленную в Xcode 6, вы можете легко настроить различные ограничения для определенных классов размера в Interface Builder. Большинство устройств (например, все текущие iPhone) имеют компактный вертикальный размерный класс в ландшафтном режиме.

Это гораздо более понятная концепция для общих решений макета, чем определение ориентации устройства.

При этом, если вам действительно нужно знать ориентацию, UIDevice.currentDevice().orientation – это путь.


Оригинальное сообщение:

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

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

 -(void)updateViewConstraints { [super updateViewConstraints]; // constraints for portrait orientation // use a property to change a constraint's constant and/or create constraints programmatically, eg: if (!self.layoutConstraintsPortrait) { UIView *image1 = self.image1; UIView *image2 = self.image2; self.layoutConstraintsPortrait = [[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[image1]-[image2]-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(image1, image2)] mutableCopy]; [self.layoutConstraintsPortrait addObject:[NSLayoutConstraint constraintWithItem:image1 attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem: image1.superview attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]]; [self.layoutConstraintsPortrait addObject:[NSLayoutConstraint constraintWithItem:image2 attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:image2.superview attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]]; } // constraints for landscape orientation // make sure they don't conflict with and complement the existing constraints if (!self.layoutConstraintsLandscape) { UIView *image1 = self.image1; UIView *image2 = self.image2; self.layoutConstraintsLandscape = [[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[image1]-[image2]-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(image1, image2)] mutableCopy]; [self.layoutConstraintsLandscape addObject:[NSLayoutConstraint constraintWithItem:image1 attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:image1.superview attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]]; [self.layoutConstraintsLandscape addObject:[NSLayoutConstraint constraintWithItem:image2 attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem: image2.superview attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]]; } BOOL isPortrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation); [self.view removeConstraints:isPortrait ? self.layoutConstraintsLandscape : self.layoutConstraintsPortrait]; [self.view addConstraints:isPortrait ? self.layoutConstraintsPortrait : self.layoutConstraintsLandscape]; } 

Теперь все, что вам нужно сделать, это инициировать обновление ограничений при изменении ситуации. Override willAnimateRotationToInterfaceOrientation:duration: анимировать обновление ограничений при изменении ориентации:

 - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; [self.view setNeedsUpdateConstraints]; } 

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

Чтобы избежать предупреждений об атак из раскадровки, я помещаю все один набор в приоритет 999, так что он не показывает красный везде.

Затем я добавляю все ограничения в выходные коллекции:

 @property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *portraitConstraints; @property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *landscapeConstraints; 

Наконец, я реализую метод viewWillLayout :

 - (void) viewWillLayoutSubviews { for (NSLayoutConstraint *constraint in self.portraitConstraints) { constraint.active = (UIApplication.sharedApplication.statusBarOrientation == UIDeviceOrientationPortrait); } for (NSLayoutConstraint *constraint in self.landscapeConstraints) { constraint.active = (UIApplication.sharedApplication.statusBarOrientation != UIDeviceOrientationPortrait); } } 

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

Я придерживаюсь того же подхода, что и ваш (без файлов nib или раскадровки). Вы должны обновить свои ограничения в методе updateViewConstraints (путем проверки ориентации устройства). Нет необходимости вызывать setNeedsUpdateConstraints в updateViewConstraints потому что, как только вы меняете ориентацию устройства, последний метод вызывается автоматически.

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

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

Обратный процесс поверните назад.

Моя идея – обрабатывать ориентацию, изменяя приоритеты ограничений.
Предполагаемые приоритеты будут:

  • пейзаж: 910 активных / 10 неактивных.
  • портрет: 920 активных / 20 неактивных.

Шаг 1. Создайте ландшафтный (или портретный) дизайн в Storyboard с ограничениями.
Шаг 2: Для ограничений, которые должны быть активны только для ландшафтного режима, установите приоритет на 10.
Шаг 3: добавьте ограничения для портретного режима и установите их приоритет 920.

В willAnimateRotationToInterfaceOrientation добавьте код:

 for (NSLayoutConstraint *constraint in myView.constraints) { if (UIInterfaceOrientationIsLandscape(UIApplication.sharedApplication.statusBarOrientation)) { if (constraint.priority == 10) constraint.priority = 910; if (constraint.priority == 920) constraint.priority = 20; } else { if (constraint.priority == 20) constraint.priority = 920; if (constraint.priority == 910) constraint.priority = 10; } } 

Преимущество этого подхода – легкая настройка в Interface Builder. Когда нам нужно переключиться на любую ориентацию, мы выбираем все ограничения по приоритету и одновременно меняем их (910-> 10, 20-> 920):

введите описание изображения здесь

Интерфейс будет автоматически восстановлен.

  • Метод делегата не вызывается?
  • Проблема экземпляра UIViewController
  • Наложение вкладки с видом
  • Порядок вызовов на performSegueWithIdentifier
  • быстрое представление uiviewcontroller
  • Как я могу полностью перезагрузить представление, чтобы viewDidLoad снова запускался?
  • Обработка контроллера вида, который скользит в любом направлении
  • iOS - Когда создавать дочерний ViewController и подкласс UIView?
  • Возможно преобразование вида на предыдущий контроллер просмотра при изменении ориентации экрана?
  • Как я могу узнать, какой ViewController активен?
  • UIModalPresentationCurrentContext и willRotateToInterfaceOrientation
  • Interesting Posts

    Ошибка выполнения Rundime backround Просмотр свойства UITableViewCell в раскадровке

    Частичная анимация pagecurl с быстрым

    iOS – работа с большими и растущими классами UIViewController

    Как построить osip (библиотека C) для iOS

    iOS – Как я могу запланировать что-то один раз в день?

    «Не удалось найти раскадровку под названием« MainStoryboard »в пакете NSBundle»

    Custom Storyboard Segue работает в симуляторе, но не на устройстве

    Как изменить XAxis, используемый на моем графике ShinobiCharts

    Отправленная операция GCD не запускается, когда приложение помещается в фоновом режиме

    iOS TapGestureRecognizer ест двойной кран для numberOfTapsRequired = 1

    Сбой CoreText при запуске в нескольких потоках

    Как изменить размер изображения в соответствии с ячейкой UITableView?

    Раскадровка PerformSegueWithIdentifier не работает

    UIActivityViewController внутри контейнера

    Как скрыть клавиатуру, не закрывая диалоговое окно с помощью Appium для IOS?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.