Оптимизация для новейшего iPad Pro Simulator

Я установил новейшую бета-версию Xcode 7.1 и пытаюсь запустить свой проект на iPad Pro Simulator. Все правильно и все функции работают правильно.

Но у меня есть проблема с размером экрана...

На главном экране приложения я запускаю следующий журнал:

NSLog(@"%f", self.view.bounds.size.width);

У меня есть 1024 для альбомной ориентации. Но когда я создаю новое приложение в Xcode 7.1 и запускаю тот же код на главном экране, я получаю другое значение: 1366.

Сегодня я планирую найти различия между файлами проекта, созданными в старом Xcode (6.4) и новейшей бета-версии 7.1 с использованием Araxis Merge.

А теперь как исправить эту проблему для моего старого проекта?

3 ответа

Я могу быть далеко отсюда, но у меня была похожая проблема с симулятором iPad Pro: он давал мне стандартное разрешение 1024*768 точек. После некоторых копаний я понял, что использую стандартное изображение запуска iPad (поскольку в каталоге ресурсов нет версии iPad Pro), что ограничило мой экран до 1024*768 точек. Как только я представил раскадровку запуска, все стало на свои места, и мое приложение запустилось с правильным размером 1366*1024 точки.

TL;DR. Похоже, что иерархия представления не регулируется под размер экрана iPad Pro до viewWillLayoutSubviews: а также viewDidLayoutSubviews: вызывается. Когда это вызывается системой макетов, зависит от построения вашей иерархии представлений.


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

Для совершенно нового проекта, используя контроллер представления, который имеет только панель навигации (расположена чуть ниже строки состояния) и основной вид (который занимает оставшуюся часть пространства с включенным автоматическим макетом, в ландшафтном режиме a ля следующего скриншота:

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

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

-[ViewController viewDidLoad] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}}
-[ViewController viewDidLoad] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}}

-[ViewController viewWillAppear:] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}}
-[ViewController viewWillAppear:] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}}

-[ViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}}
-[ViewController viewWillLayoutSubviews] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}}

-[ViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[ViewController viewDidLayoutSubviews] self.primaryView: .frame: {{0, 64}, {1366, 960}}; .bounds: {{0, 0}, {1366, 960}}

-[ViewController viewDidAppear:] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[ViewController viewDidAppear:] self.primaryView: .frame: {{0, 64}, {1366, 960}}; .bounds: {{0, 0}, {1366, 960}}

Из того, что я вижу здесь, представление начинается с ширины 1024 точки, но после выполнения viewDidLayoutSubviews был определен соответствующий размер (1366 точек).

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

-[XYZViewController viewDidLoad] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}}

-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}}
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}

-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}

-[XYZViewController viewWillAppear:] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}

-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}

-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}

-[XYZViewController viewDidAppear:] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}

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

Если по каким-либо причинам вы жестко программируете фрейм каких-либо элементов пользовательского интерфейса, вам, возможно, придется изменить его для будущего iPad Pro. Потому что у него совсем другой размер экрана (в пунктах).

Если вы используете автоматическое расположение и динамические кадры (например, self.view.bounds.size.width), я думаю, что все должно работать нормально.

Другие вопросы по тегам