Почему мне нужно дважды вычесть высоту UINavigationBar, чтобы получить правильный размер UIWebView? - PullRequest
0 голосов
/ 20 декабря 2010

Я использую UINavigationBar в своем приложении с тремя различными UIViewControllers.RootViewController скрывает панель навигации, когда ее представление находится на вершине стека, реализуя в RootViewController.m следующее:

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];

[self.navigationController setNavigationBarHidden:TRUE animated:TRUE];}

и

- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];

[self.navigationController setNavigationBarHidden:FALSE animated:TRUE];}

Когда firstViewController помещается наверх, все работает просто отлично.В IB я сказал, что у него есть строка состояния и панель навигации.Все его подпредставления (добавленные в IB) выложены так, как и ожидалось, на симуляторе и на устройстве.

Однако, когда secondViewContoller выдвинут наверх, все становится странным.В IB я сказал, что есть строка состояния и панель навигации, как и раньше.Я добавил UIWebView, чтобы заполнить оставшуюся часть экрана (проверенные размеры 320 x 416 в IB), и в IB все выглядит правильно.Я запустил приложение на симуляторе и на моем устройстве, и UIWebView работает за панелью навигации, как если бы оно было 320 x 460.

Чтобы исправить эту проблему, я добавил этот код в SecondViewController.m:

- (void)viewDidLoad {
[super viewDidLoad];

[webView setFrame:CGRectMake(0.0, 44.0, 320.0, 372.0)]; }

А теперь все выглядит нормально при работе на симуляторе и устройстве.Но это не правильно!Высота на самом деле 416, а не 372. Почему мне пришлось дважды вычесть высоту UINavigationBar?Мой хак работает, но я думаю, что есть кое-что важное, что я здесь упускаю, что мне действительно нужно понять.Любые идеи с благодарностью.

1 Ответ

1 голос
/ 20 декабря 2010

Не совсем уверен, почему вам нужно вычесть высоту дважды , но я могу объяснить, почему вы должны это делать вообще.

В основном, в viewDidLoad, вашКонтроллер представления и связанный с ним вид понятия не имеют, где они будут использоваться.Это означает, что ваш вид в настоящее время не имеет суперпредставления.Если вы устанавливаете свой кадр до того, как контроллер представления будет представлен модально, добавлен в стек навигации или представлен в панели вкладок, представление может быть перемещено и изменено в размере, а также все виды сумасшедших вещей.Ответом на эту проблему является выполнение макета в viewWillAppear: вместо:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    webView.frame = self.view.bounds;
}

Этот фрагмент кода отрегулирует веб-представление для заполнения области, занятой контроллером представления, и выполнится непосредственно перед представлениемпросмотр на экране.Когда он выполняется, self.view уже настроен для учета панели навигации, панели вкладок, строки состояния и т. Д.

...