Как стать автором
Обновить

Комментарии 19

Думаю это многим пригодится!
Благодарю за хорошую и полезную статью!

P.S. Можно ли все это проделать в коде, не используя storyboard?
Можно и в коде.
1. Есть протокол UITraitEnvironment и метод:
 traitCollectionDidChange:(UITraitCollection *)previousTraitCollection 

который следит за изменениями текущего trait collection.

2. А для изменения UITraitCollection вручную можно проделать следующее:


    UITraitCollection *horizontalSizeClass = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];
    [self setOverrideTraitCollection:horizontalSizeClass forChildViewController:self.viewController];


либо так:


    UITraitCollection *verticalSizeClass = [UITraitCollection traitCollectionWithVerticalSizeClass:UIUserInterfaceSizeClassCompact];
    UITraitCollection *horizontalSizeClass = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];
    NSArray *traitCollectionArray = [NSArray arrayWithObjects:verticalSizeClass, horizontalSizeClass, nil];
    UITraitCollection *combinedTraits = [UITraitCollection traitCollectionWithTraitsFromCollections:traitCollectionArray];
    [self setOverrideTraitCollection:combinedTraits forChildViewController:self.viewController];
Я бы посоветовал еще юзать вторым окном Preview, чтобы было видно результаты изменений в реальном времени
Согласе, Preview очень полезная штука, тем более в Xcode 6 можно просматривать результат одновременно на всех семействах устройств, при чем с их же портретными ориентациями, что очень удобно!
Ну, я это и имел ввиду :) У вас не возникало проблем с программным созданием constraits в xcode 6?
Честно, пытаюсь не создавать программно constraits, только в крайнем случае. Все таки через storyboards визуально удобней :)
Ух, вас ждут новые открытия! :)
Кстати, а почему примеры на obj-c? Почему не swift?
Для меня пока obj-c более родной, да и swift не очень нравится. Хотя от него уже не уйдешь :)
Спасибо! Исправил. Статью писал в конце рабочего дня, еще и в пятницу, по этому ошибки не исключены :)
Чувствую, теперь больше времени будет уходить на расстановку кнопочек, чем на написание кода.
Вместо того, чтобы упростить описание интерфейса путем переноса этого самого описания в декларативный код (xaml в качестве примера), Apple накрутила еще одну неочевидную сущность :( И так «верстать» iOS UI было тяжко, а стало еще запутанней. И не понять, толи это наследие, которое навсегда останется с разработчиком, толи оптимизация (тобиш потребуем от разработчика как можно больше данных, зато железке будет проще из переваривать), толи я чего-то не понимаю/не осилил. Но вот честно, мне проще ручками описать xml с версткой, чем работать с эпловским UI дизайнером. Может порекомендуете чего толкового почитать на эту тему? Или там дзен достигается лишь путем проб и ошибок?

Автору за статью огромное спасибо. Познавательно и полезно.
Xaml, по крайне мере на десктопе очень мощная штука, к примеру, засунуть в button grid нет сложности, но из-за этого дикий overhead.
Думаю, что Apple бьется за эффективное использование ресурсов. Смотрел сессию с WWDC 2014 где рассказывали про blur использованные в UX iOS7,8 (центр уведомлений, control center), приводили примеры как и почему это очень ресурсоёмкая штука. А т.к. blur-ы очень модная сейчас вещь, то представляю, как дизайнер может накрутить в xaml 2-3 плоскости с блюром перекрывающие друг друга, тут то fps у интерфейса и просядет, и аккумулятора побольше скушает.
Скажите, пожалуйста, как различить программно в какой у нас ориентации iPad c помощью UITraitCollection?
Именно с помощью UITraitCollection различить не получится, так как при его использовании HorizontalSizeClass и VerticalSizeClass будет == regular. В итоге, в какой ориентации б iPad не был, SizeClasses всегда будут regular. Более того при подключении протокола UITraitEnvironment и запуске приложения на iPad, метод:
 - (void) traitCollectionDidChange:(UITraitCollection *)previousTraitCollection

при смене ориентации вызываться НЕ будет.
Так вот я и думаю если надо разный лайаут в разных ориентациях ipad то что делать?
В интернете подсказывают два решения проблемы
1) ориентироваться на viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:
2) проверять в viewDidLayoutSubviews и обновлять layout
Спасибо. Первый способ выглядит привлекатльным, но как-то всё равно не то…
Ходят слухи, что это сделано специально для того, что бы дать возможно запускать на айпадах по несколько приложений одновременно в двухоконном режиме. в таком случае, привязка к ориентации выглядит действительно глупо. Но опять же, слухи… за что купил, за то и продал
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории