Оптимизация для новейшего 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), я думаю, что все должно работать нормально.