Адаптивные раскадровки экрана запуска: есть ли способ дифференциации ориентации iPad?
Я исследую использование раскадровки для запуска изображений для моего приложения. Приложение всегда использовало большое фото для стартового изображения, которое также используется в качестве фона для первого просмотра. Однако изображение отличается, когда приложение запускается в альбомной ориентации на iPad.
Так есть ли способ отличить iPad в книжной ориентации от iPad в альбомной ориентации при использовании адаптивной раскадровки для экрана запуска? Поскольку это стартовый экран, я не могу запустить какой-либо код, это должно быть сделано полностью через раскадровку.
4 ответа
Я нашел решение, используя разделительные виды, которые помещают правильное изображение в видимую область и перемещают другое изображение за пределы экрана (как предложено Дэвидом Х.).
Вы не можете предоставить разные изображения для экрана разных размеров (iPhone 4, iPhone X, ...), но если вам нужны разные изображения для iPhone и iPad и разные изображения для портрета и ландшафта, это решение для вас.
Я создал пример проекта на github, если вы хотите попробовать его. Работает на iPad и iPhone.
Важные ограничения
PortraitSpacer.width ≤ 5 × view.width
PortraitSpacer.width ≤ 5 × view.height
LandscapeSpacer.width ≥ 5 × view.width
LandscapeSpacer.width ≥ 5 × view.height
PositionSpacer.width = 5 × view.width
где view.width
а также view.height
ширина и высота основного вида.
PortraitSpacer
позиционирует портретное изображение в 5 × min(view.width, view.height)
, LandscapeSpacer
позиционирует ландшафтное изображение в 5 × max(view.width, view.height)
и PositionSpacer
имеет ту же ширину, что и PortraitSpacer
в портретном режиме и такой же ширины, как LandscapeSpacer
в ландшафтном режиме.
Мы умножаем все на 5, чтобы два изображения не перекрывались. Это работает для всех устройств, где верно следующее
5 × min(view.width, view.height) + max(view.width, view.height) ≤ 5 × max(view.width, view.height)
В ландшафтном режиме это будет означать
5 / 4 ≤ view.width / view.height
это относится ко всем текущим устройствам: iPad имеет самое низкое соотношение сторон 4:3, которое все еще больше 5:4.
Затем вы можете, конечно, настроить изображения для устройства (iPhone, iPad) в каталоге активов.
В наши дни Apple поощряет думать о ротации не с точки зрения ориентации устройства, а просто как изменение анимированных границ (иногда с семантическим намеком).
Мы увидели, почему с iPhone 6 Plus - то, что раньше было "телефоном, портретным" интерфейсом, становится интерфейсом боковой панели в альбомной ориентации на некоторых телефонах.
Чем больше ваши контроллеры представлений об устройствах и их ориентации, тем сложнее адаптировать их к новым устройствам, которые предлагают новые способы повторного использования контроллеров представлений.
Также, UIDeviceOrientation
это не то же самое, что UIInterfaceOrientation
, Если вы используете первый для принятия решений по пользовательскому интерфейсу, вы будете в тупике, когда устройство будет лицом вверх или вниз, и (IIRC) ваши пользователи будут разочарованы, когда ваше приложение не будет соблюдать блокировку ориентации.
Так в чем же разница между альбомным и портретным iPad? Оба являются Регулярными х Регулярными по признакам... Но у каждого есть границы, которые выше, чем они широки, и наоборот. Совершенно нормально принимать высокоуровневые макетные решения на основе соотношения сторон (и использовать автоматическое макетирование для деталей).
На самом деле вы можете указать различные изображения экрана запуска изнутри вашего LaunchScreen.storyboard
с Xcode8
, Используя LaunchScreen.storyboard
является предпочтительным способом указания экрана запуска при таргетинге на устройства, работающие iOS8
и выше.
Вот быстрый пошаговый пример того, как указать альбомные изображения для устройств, которые поддерживают экраны запуска в альбомной ориентации:
- Сначала добавьте ваши изображения "заставки" в ваши проекты
Assets.xcassets
, Вам нужно только два отдельныхImage Sets
: один дляportrait
и один дляlandscape
, Назовите их что-то вродеsplash
(это набор портретных изображений) иsplash-landscape
(это ландшафтный). - Теперь, когда у вас есть ваши изображения в ваших проектах
assets
перейти к вашейLaunchScreen.storyboard
файл. (Я предполагаю, что у вас уже есть контроллер представления экрана запуска, настроенный с изображением, и его ограничения установлены вLaunchScreen.storyboard
.) - Выберите
ImageView
то есть на экране запускаviewcontroller
, - Перейти к
Assets Inspector
дляImageView
, - Добавьте изображение "всплеск" к
Image
исходное поле. Это ваш портретный источник изображения. - Нажмите на
+
кнопка рядом сImage
исходное поле, которое вы установили в шаге 5. - В появившемся всплывающем окне выберите
Regular
для обоихWidth
а такжеHeight
селекторы. Это указывает на новый адаптивный набор для iPad, которые находятся в альбомной ориентации. Новое поле источника изображения появится с заголовкомwR hR
, Добавьте изображение "всплеск-пейзаж" кwR hR Image
поле источника, поэтомуstoryboard
знает использовать другое изображение, когда в ландшафте. - Теперь нам нужно добавить поддержку устройств "iphone plus" в альбомной ориентации. Так что нажмите
+
кнопка рядом сImage
поле источника снова. - На этот раз выберите
compact
дляheight
а такжеregular
дляwidth
селекторы. Это указывает на новый адаптивный набор для устройств "iPhone plus", которые находятся вlandscape
, Новое поле источника изображения появится с заголовкомwR hC
, - Добавьте изображение "всплеск-пейзаж" к
wR hC Image
поле источника, поэтомуstoryboard
знает, как использовать другое изображение в альбомной ориентации на устройстве "iphone plus".
Выполнив эти шаги, вам не придется писать какой-либо код, делать что-то странное или полагаться на старый launchScreen image sets
, LaunchScreen.storyboard
все справлюсь за тебя! Это довольно опрятно.
Для получения дополнительной информации о классах размеров и Интерфейсном Разработчике посмотрите удивительную статью: https://medium.com/@craiggrummitt/size-classes-in-interface-builder-in-xcode-8-74f20a541195
Редактировать: это всего лишь краткий надуманный пример того, что я сделал, чтобы заставить изображения SplashScreen работать с использованием отдельных наборов изображений, адаптивных наборов и ограничений. Требовалось много возиться с ним, чтобы заставить его работать (почти всю ночь, а потом и немного). Сложно объяснить Interface Builder
и все различные аспекты этого в пошаговом посте. Так что используйте этот ответ и пример в качестве руководства, чтобы добраться туда, куда вам нужно. Кроме того, ссылка выше очень полезна. Кроме того, кто знает, может я просто ошибаюсь или что-то неправильно понимаю...
Надеюсь, кто-то найдет это полезным.
Ориентацию устройства довольно просто проверить на лету, а также получать уведомления об изменениях ориентации.
(Здесь все в Objective-C)
Перейдите к вашему делегату приложения и в вашем приложении DidFinishLaunchingMethod
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//
//then call this, what we're telling the device is, "Hey, let me know when you change orientations!"
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
//Not done yet, now we have to register a method to call on the notification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil];
}
Теперь вам нужно определить метод, который вызывается, когда устройство ориентировано.
Итак, где-то в вашем приложении делегат...
- (void) deviceOrientationDidChange {
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
if (orientation == UIDeviceOrientationPortrait) {
//do something if portrait
}
else {
//do another thing if landscape
}
}
И это действительно все, что нужно сделать. Затем вы можете изменить фоновое изображение в этом методе!
Я не пересматривал это в течение нескольких лет, но я убежден, что ответ - нет, вы не можете различить ориентацию iPad в раскадровке экрана запуска.
Другие ответы здесь касаются того, как дифференцировать ориентацию в коде, но вы не можете запустить какой-либо код для раскадровки экрана запуска.