Почему высота моего корневого представления не учитывает его панель навигации? - PullRequest
5 голосов
/ 16 мая 2011

У меня сложилось впечатление, что панель навигации UINavigationController всегда будет опускать высоту дочернего представления так, чтобы источник дочернего представления находился внизу строки заголовка.

Но когда я представляю контроллер вида, подобный этому ...

MyViewController *viewController = [[MyViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
viewController.title = @"My View Controller";
viewController.navigationItem.prompt = @"My Prompt";
viewController.delegate = self;

[self presentModalViewController:navigationController animated:YES];
[navigationController release]; [viewController release];

... и затем проверьте self.view.frame.size.height с NSLog в viewDidLoad, он сообщает, что мой взгляд имеет высоту 460 пикселей. Разве это не должно вычитать высоту моего заголовка и приглашения?

Ответы [ 2 ]

18 голосов
/ 17 мая 2011

Итак, по запросу:

Когда вы звоните viewDidLoad, контроллер представления еще не выдвинут на экран. Поэтому, когда вы получите размер кадра из этого метода, он сообщит о его значении по умолчанию (как правило, 320x480 для приложения iPhone).

После этого представление автоматически изменяет размеры с учетом панели навигации. Поэтому, когда вы проверяете размер кадра в viewWillAppear, теперь это будет правильно. Как правило, это не проблема для приложений iPhone. Для приложений iPad, где у вас несколько ориентаций, это может быть немного болезненно!

Есть несколько исключений из этого - например, при использовании NIB.

3 голосов
/ 16 мая 2011

Вероятно, вы имеете в виду неправильно self здесь.Когда self относится к экземпляру MyViewController, вы, вероятно, будете иметь высоту 460–44 пикселей (стандартная UIToolbar высота), но если self относится к родительскому контроллеру вида (например, самому контроллеру навигационного представления), выВы увидите стандартную высоту вида (например, 460 пикселей).

Вы можете проверить это, вызвав self.view.frame.size.height внутри экземпляра MyViewController, например, когда представление закончило загрузку (метод viewWillAppear:), иразмер уже был изменен его контроллером навигации.

Если вы вызываете self.view.frame.size.height из метода viewDidLoad, представление, вероятно, все еще не было изменено его родительским контроллером.

Пожалуйста, попробуйте еще раз и дайте мне знать, если это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...