2015-09-14 3 views
7

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

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

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

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

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

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

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

+0

Есть ли новости по этому вопросу? У меня та же проблема. Независимо от того, что я делаю, я постоянно получаю 1024 * 768 в симуляторе iPad Pro. –

+0

@GergelyKovacs пока я не знаю, как заставить его работать. Я собираюсь вернуться к этой проблеме на следующей неделе. Я опишу результаты, если найду что-нибудь интересное. –

+0

@AlexanderBalabanov - Можете ли вы предоставить дополнительную информацию о проблеме, которую вы испытываете, чтобы мы могли помочь? Я также искал поддержку iPad Pro и хотел бы убедиться, что мы все можем поддержать его соответствующим образом. Где вы запускаете инструкцию NSLog для просмотра границ представления? Вы используете автоматическую компоновку? Если вы можете предоставить нам еще какой-то контекст того, что вы испытываете, то, надеюсь, мы сможем вместе работать, чтобы помочь решить эту проблему. –

ответ

0

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

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

+0

Я использую автоматическую компоновку и динамические рамки. У меня нет жестких фреймов кода. Это странно, но это не работает нормально ... –

+0

Но, что не работает на вас? В этом вопросе вы упомянули, что ваше приложение работает нормально. –

+0

Все работает отлично, но я хочу получить значение self.view.bounds.size.width == 1366 на iPad Pro Simulator. У меня всего 1024. Но когда я создаю новый проект в Xcode 7.1, значение self.view.bounds.size.width == 1366. –

1

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


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

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

Sample view controller with navigation bar and auto-layout

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

-[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}} 

из того, что я могу видеть здесь, вид начинается с wi dth из 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:. Но, как вы можете видеть, это действительно зависит от вашей иерархии представлений - поэтому я бы рекомендовал вам подтвердить вашу иерархию представлений, а затем определить наилучшее местоположение для добавления вашего кода, зависящего от разрешения.

+0

Новый метод 'viewWillTransitionToSize: withTransitionCoordinator:' также даст вам правильную геометрию кадра. –

+1

Спасибо за ваш комментарий @KoreyHinton! Я еще не посмотрел на это, так что это может быть так, однако, поскольку 'viewWillTransitionToSize: withTransitionCoordinator:' на самом деле не является частью стандартного жизненного цикла контроллера представления, реализация этого просто для получения правильного размера кажется немного ненужным , Согласно документам Apple, это касается изменений размера и характеристик, которые я бы не ожидал, что они будут такими, поскольку iPad и iPad Pro являются регулярными/регулярными как для портретной, так и для ландшафтной ориентации. –

+0

Downvoter: Можете ли вы оставить комментарий с вашей озабоченностью, чтобы я мог попытаться ответить на него своим ответом? Я понимаю, что, хотя я не могу дать объяснение тому, как инфраструктура Apple справляется с этим в фоновом режиме, информация, которую я опубликовал, является точной, а фактические границы iPad Pro доступны изнутри жизненного цикла контроллера представления, хотя не может быть, когда мы ожидайте их. Пожалуйста, дайте мне знать, какую дополнительную информацию вы найдете полезной, и я буду рад исследовать/обновить по мере необходимости. Благодарю. –

3

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

+0

У меня тоже есть раскадровка для моего приложения и тестового приложения, которое я собрал, чтобы подтвердить это поведение, но все же, как я объяснил в своем ответе Я не вижу фактический размер, отраженный дольше в жизненном цикле контроллера представления. Когда вы говорите «мое приложение запущено с правильным размером», где вы подтверждаете это?Имеется ли у вашей раскадровки сценарий определенная конфигурация? В моем раскадровке только что установлен по умолчанию: выведенный размер/ориентация/и т. Д. Изображение запуска отображается правильно, но VC по-прежнему не получают правильные границы до конца. –

+0

Я подтвердил правильный размер, просто зарегистрировав размер окна rect. И я не использую ничего особенного; так что я фактически использую простой .xib с предполагаемым размером (а не раскадрой), но он должен давать те же результаты. –