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. Это потребует почти никакого кода, и вам, вероятно, не придется добавлять какие-либо ограничения вручную.

  • iOS6: supportedInterfaceOrientations не работает (вызывается, но интерфейс по-прежнему вращается)
  • Отключение Facebook от приложения на iOS6?
  • Вернуть Xcode 4.5 новые XIB-файлы в iOS <6
  • При каких условиях происходит перезагрузка AppleIdentifier?
  • Как локализовать iOS 6 новых цепей конфиденциальности Info.plist?
  • iOS 6 возвращает ориентацию после функции увольненияModalViewController
  • Карта Annotation showCallout-iOS
  • Восстановление покупок в iOS
  • Пользовательская линия маршрута карты
  • Как оживить NSLayoutConstraint в CAAnimationGroup
  • ios - ошибки «autorelease unavailable» и «ARC запрещает явные сообщения о отправке ошибок авторекламы»
  • Interesting Posts

    Сервер Mac OS X Build Отсутствует файл с архивированным расширенным расширением .xcent в IPA

    Изменить высоту высоты представления UISearchController в iOS 8?

    Какие функции отпечатков пальцев iOS SDK уникальны для каждого устройства?

    Объекты Realm периодически прерываются, когда приложение запускается

    Как остановить отображение модального вида при повороте на iPad?

    iOS Simulator слишком большой

    iCloud не вставляет предыдущие данные версии, если я обновляю тестовую версию на версии appstore

    setNeedsLayout и setNeedsDisplay

    Странная реакция при сравнении дат с currentDate Swift

    SLComposeViewController Facebook публикует как iOS вместо Facebook Application Identifier

    Перенос основных данных с несколькими моделями

    Ошибка UIAlertView вне границ массива текстового поля, но не с использованием текстовых полей

    iOS Safari RTL Offset с использованием -webkit-overflow-прокрутки: touch и -webkit-transform: translate3d (0,0,0)

    разматывать segue не работает

    Предполагается, что объекты macOS и iOS должны иметь один и тот же файл прав?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.