UIViewController viewDidLoad

У меня есть новый проект, и я могу работать с функцией iOS 5+, поэтому я решил использовать возможности AutoLayout и UIViewController childControllers .

Экран, который я пытаюсь создать, прост: 1. В верхней области имеется множество «сложных» элементов управления. 2. Нижняя область представляет собой табличное представление для визуализации результатов.

Что я хочу

Я хочу, чтобы область управления заняла все необходимое место (то есть место, которое я дал в Interface Builder). При необходимости TableView будет уменьшаться.

проблема

При загрузке из XIB кадр UIViewController.view ВСЕГДА имеет размер 0x568. Я ожидал 0x200 (если 200 был размером, который я сконфигурировал в Interface Builder).

Что работает: с AutoLayout

Я создал XIB со всем своим элементом. Я сделал выход на «корневом представлении», и я сделал вывод и все виды контейнеров.

Затем в моем методе viewDidLoad я добавил контейнеры и сконфигурированные ограничения.

 -(void) setupConstraints { NSMutableArray *constraints = [NSMutableArray arrayWithCapacity:1]; // Views dictionary. UIView *topView = self.topView; UIView *table = self.tableTracks; NSDictionary *views = NSDictionaryOfVariableBindings(topView, table); // Views metrics. NSNumber *topViewHeight = [NSNumber numberWithFloat:self.topView.frame.size.height]; NSDictionary *metrics = NSDictionaryOfVariableBindings(topViewHeight); // Pin the topView to the top edge of the container. [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topView(==topViewHeight)][table]|" options:0 metrics:metrics views:views]]; // Pin the topView edges to both sides of the container. [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[topView]|" options:0 metrics:nil views:views]]; // Pin the table edges to both sides of the container. [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[table]|" options:0 metrics:nil views:views]]; [self.view addConstraints:constraints]; } 

При этом я могу просто изменить размер представления topView с помощью Interface Builder, и TableView будет изменяться по мере необходимости (без сопротивления сжатию, мне все равно, если мы не увидим таблицу).

Что НЕ AutoLayout : с AutoLayout и ChildControllers

Тогда для простоты я выбираю использовать ChildControllers (много выходных данных, необходимых для выполнения пользовательской настройки UIFont, слишком плохой XCode не может их обработать!). Я внесла следующие изменения:

  1. Созданы классы HomeTopViewController + XIB. Созданы классы HomeTableViewController + XIB.
  2. Скопировал все представления из источника в правильный XIB. Добавьте ссылки UIViewController + проводные выходы.
  3. Корневой контейнер HomeTopViewController настроен на высоту HomeTopViewController .
  4. Проводка моих контейнеров к розетке моих детских контроллеров.

Затем я обновил свой код установки до следующего:

 -(void) _addChildViewControllersAndSetupConstraints { // Get required metrics variables NSNumber *topViewHeight = [NSNumber numberWithFloat:self.topViewController.view.frame.size.height]; CFShow(self.topViewController.view); // log is : <UIView: 0xa209c20; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0xa2097e0>> NSLog(@"self.topViewController.view.frame.size.height = %f", self.topViewController.view.frame.size.height); // Informs controllers the ADD operation started [self addChildViewController:self.topViewController]; [self addChildViewController:self.tableViewController]; // Add view to the view's hierarchy self.topViewController.view.translatesAutoresizingMaskIntoConstraints = NO; self.tableViewController.view.translatesAutoresizingMaskIntoConstraints = NO; [self.view addSubview:self.topViewController.view]; [self.view addSubview:self.tableViewController.view]; // Setup constraints NSMutableArray *constraints = [NSMutableArray arrayWithCapacity:1]; // Views dictionary UIView *topView = self.topViewController.view; UIView *table = self.tableViewController.view; NSDictionary *views = NSDictionaryOfVariableBindings(topView, table); // Views metrics dictionary NSDictionary *metrics = NSDictionaryOfVariableBindings(topViewHeight); // Pin the topView to the top edge of the container. [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topView(==topViewHeight)][table]|" options:0 metrics:metrics views:views]]; // Pin the topView edges to both sides of the container. [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[topView]|" options:0 metrics:nil views:views]]; // Pin the table edges to both sides of the container. [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[table]|" options:0 metrics:nil views:views]]; // Adds constraints [self.view addConstraints:constraints]; // Informs controllers the ADD operation ended [self.topViewController didMoveToParentViewController:self]; [self.tableViewController didMoveToParentViewController:self]; } 

проблема

Независимо от того, как я сортирую контейнер HomeTopViewController в HomeTopViewController строка CFShow(self.topViewController.view); всегда будет давать мне frame = (0 0; 320 568) когда я ожидал 200px.

Я настроил размер макета на «Freeform» или «None».

Чего я хочу избежать как можно больше

Мне бы очень хотелось создать другие магазины, а затем View on HomeTopViewController и HomeTableViewController и сохранить исходный фрейм / высоту в свойстве UIViewController.

Вопросов

  1. Во время загрузки все свойства controller.view.frame отображаются на экране? (будь то 3,5 или 4 дюйма)
  2. Как я могу решить эту проблему без hardcoding размером где-нибудь / создания дополнительных выходов?

One Solution collect form web for “UIViewController viewDidLoad”

Это было бы легче, если бы вы использовали раскадровку. Вы можете добавлять представления контейнера к виду вашего основного контроллера и размер их, как вам нравится, и вы автоматически получаете контроллеры представлений, встроенные в эти представления контейнеров, которые установлены в правильный размер. Эти представления контейнера (рядом с обычным UIView в списке объектов) доступны только в раскадровке, а не в xib. Это потребует почти никакого кода, и вам, вероятно, не придется добавлять какие-либо ограничения вручную.

  • Плохая производительность прокрутки MapKit с помощью Apple Maps в iOS 6
  • Где экземпляр UIWindow и сценарий перешел?
  • Переместите строки вниз в TableView, который использует CoreData
  • Пропорциональные ограничения расстояния в макете
  • MapKit в iOS 6 - Как найти места поблизости ...?
  • iOS: Есть ли способ открыть защищенные паролем документы Microsoft Office?
  • Перспективный выпуск в 3D-ротации
  • Блокировка UISearchBar в верхней части UITableView
  • iOS 6 - кнопка «Like» для Facebook
  • iPhone Simulator 6.0 не может подключиться к gamecenter в режиме песочницы
  • Почему glReadPixels () не работает в этом коде в iOS 6.0?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.