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

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

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

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

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

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):

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

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

  • Как можно вернуться к предыдущему виду программно без UINavigationController?
  • Как изменить размер представления при использовании UINavigationController setToolbarHidden: анимированный:
  • Невозможно принудительно настроить ориентацию UIViewController
  • Вставить UITableViewController в другой UIView
  • Как я могу реализовать делегирование для контроллера представления, представленного segue?
  • Остановка модального UIViewController от вращения
  • Статус кнопки UIViewController всегда одинаковый
  • Представить прозрачный модальный UIViewController
  • как получить идентификатор раскадровки диспетчера просмотра или повторный идентификатор в обратной навигации?
  • Получите ошибку EXC_BAD_ACCESS после добавления viewcontroller'view в качестве subView к другому представлению viewcontroller?
  • Добавление нового представления Viewcontroller в качестве подзадачи
  • Interesting Posts

    Как я могу использовать UIButton в дополнительном представлении UICollection?

    Настройка оповещения UILocalNotification – с помощью ползунка или кнопок салфетки

    как установить MaxDate и MinDate в DatePicker, возвращенный из webservice на ios

    peoplePickerNavigationController: shouldContinueAfterSelectingPerson: property: identifier:

    UISearchBar такой же, как и функция поиска iMac Finder

    Показать ошибку из расширения Share

    Swift – производительность – сравнение двух массивов и различие в каждом и общее в обоих

    Как читать прогресс буферизации AVURLAsset?

    Onsen-UI с использованием скользящего меню с навигатором

    установить значок в элементе табуляции при получении уведомления

    Предотвращение объединения основных данных в единую таблицу

    Неизвестное имя типа 'CGFloat' при попытке добавить PanoramaGL в статическую библиотеку

    Есть ли объяснения относительно ?

    Нет подходящего профиля

    __attribute__ ((устарело)) не работает в методах протокола object-c?

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