Определите правильный размер в loadView - PullRequest
19 голосов
/ 20 сентября 2011

Как правильно определить правильный размер для разметки вашего вида в loadView?

У меня есть разные случаи, когда UIViewController помещается в UINavigationController, или присутствует UITabBarController, или и то, и другое. Эти элементы изменяют доступную область экрана и делают ее несовместимой, если я жестко кодирую значения.

В тот момент, когда вызывается loadView, и я хочу знать, как определить размер контейнера, к которому я добавляю свои подпредставления.

Я просмотрел руководство по UIViewController, и Apple использует UIScreen mainScreen applicationFrame, но в их примере это сделано, потому что они делают полноэкранное приложение.

Я видел здесь несколько ответов, но ни один из них не касается того, как сделать это согласованным образом.

Спасибо за любую помощь.

Ответы [ 4 ]

14 голосов
/ 07 сентября 2013

Вам не нужно знать точный размер.VC не должен измерять себя, это ответственность его родителя.Просто создайте UIView с [[UIView alloc] init], что подтверждается инженером Apple UIKit Энди Матущаком в Twitter: https://twitter.com/andy_matuschak/status/365227892151558144

13 голосов
/ 20 сентября 2011
- (void) loadView {
     //self.wantsFullScreenLayout = YES; //could add this for translucent status bars
     UIView *view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
     self.view = view;
}

Из Apple Руководство по программированию контроллера представления для программного создания представления:

  1. Создание корневого объекта просмотра, размер которого соответствует размеру экрана. Корневое представление действует как контейнер для всех других представлений, связанных с вашим контроллером представления. Ты типично определите рамку для этого представления, чтобы соответствовать размеру окна приложения, которое само должно заполнить экран. Тем не менее, контроллер представления также регулирует размер кадра по мере необходимости, чтобы приспособить присутствие различных видов, таких как строка состояния системы, панель навигации или панель вкладок. Вы можете использовать универсальный объект UIView, пользовательское представление, которое вы определяете, или любое другое представление, которое можно масштабировать для заполнения. экран.

Тогда у него есть пример, который похож на тот, который я написал выше.

0 голосов
/ 04 ноября 2011

«Правильный» ответ, вероятно, состоит в том, чтобы создать пользовательский подкласс UIView и выполнить все позиционирование представления subview в переопределении layoutSubviews.Ваш подкласс будет затем назначен для self.view в loadView.

Однако, он также работает, чтобы использовать viewDidLoad для добавления подпредставления идентичного размера в self.view.(Хотя вы должны быть готовы к тому, что это представление изменит размер. - Правильная установка autoresizingMasks может быть хорошим способом сделать это.)

0 голосов
/ 20 сентября 2011

Я создал приложение, оно загружает несколько UITextViews, UIButtons и элемент управления UISegment. То, что я сделал в viewWillAppear, я вызываю метод изменения размера, который я сделал.

Изменяет размеры всех подпредставлений в UIViewController программным способом. Это связано с тем, что автоматическое изменение размера в IB очень хорошо.

В моей функции calcViewSize я получаю такие размеры;

CGFloat width = [[UIScreen mainScreen] applicationFrame].size.width;
CGFloat height = self.view.frame.size.height; //this will retrieve the frame we are drawn into.

Затем я просматриваю каждое подпредставление в UIViewController, размер которого хочу изменить, и изменяю его фрейм. У меня есть свойства для этих представлений в IBOutlets, поэтому я уже знаю, что это за представления.

Используйте Interface Builder для получения размеров.

Последнее замечание: чтобы изменить размеры в IB, выберите «Вид», выберите инспектор атрибутов, отключите строку состояния, теперь в «Инспекторе размеров» вы можете изменить размер представления, изменить расположение подпредставлений и записать числа для размещения. в вашем коде.

...