Почему self.bounds.size.height не учитывает навигационную панель UINavigationView в этом коде? - PullRequest
7 голосов
/ 03 августа 2011

У меня есть конфигурация UITableView, которая может запускать палитру цветов с помощью подхода UINavigationController:

[self.navigationController pushViewController:colorPickerViewController animated:YES];
[colorPickerViewController release];

Эффект этого означает, что ColourPicker будет иметь панель навигации вверху (и кнопку назад)

Структура ColourPickerViewControll и его представление ColourPickerView выглядит следующим образом:

- ColourPickerViewController - in it's XIB file at the top level view it has:
  - ColorPickerView : UIView (i.e. custom UI view) - in it's methods it has:
    - (id)initWithCoder:(NSCoder*)coder  {
       if ((self = [super initWithCoder:coder])) {
         CGFloat currVertBounds = self.bounds.size.height;

Проблема здесь в том, что значение currVertBounds приближается к 480, поэтому оно не учитывает панель навигации

ВОПРОС: Как получить истинную отображаемую высоту экземпляра ColorPickerView?

Это как-то связано с попыткой вычислить макет в пользовательском UIView, и, возможно, пользовательское представление не отображается в общем controll / navigationController на этом этапе?

Ответы [ 3 ]

7 голосов
/ 03 августа 2011

Вы читаете bounds слишком рано. Ни одна из магии макета / подписки, которая происходит в UIKit, не будет происходить в течение [super initWithCoder:]. Вы должны прочитать bounds и выложить свою точку зрения либо:

  1. В viewDidLoad / viewWillAppear и настройте параметры авторазмера для всех созданных вручную элементов пользовательского интерфейса, чтобы их можно было перемещать относительно различных ориентаций интерфейса. В этих функциях я бы не стал полагать, что bounds будет точным, но я бы сказал, что это как минимум правильное соотношение высоты и ширины. Возможно, это может быть неправильная ориентация.
  2. В viewDidAppear, если вы хотите расположить элементы вручную. К тому времени, когда вы нажмете viewDidAppear, все изменения размера и тому подобное уже произошли, и единственное, о чем нужно беспокоиться, это будущие повороты, для которых вы должны настроить свой взгляд в willAnimateRotationToInterfaceOrientation:duration:.

Документы на willAnimateRotationToInterfaceOrientation:duration: состояние:

К тому времени, когда этот метод вызывается, свойство interfaceOrientation уже имеет новую ориентацию. Таким образом, вы можете выполнить любой дополнительный макет, требуемый вашими представлениями в этом методе.

В документах по iOS 5.0 добавить предложение:

... установите новую ориентацию , и границы вида были изменены . Таким образом ...

Я думаю, что это относится и к предыдущим версиям iOS.

1 голос
/ 03 августа 2011

Представления для iPhone по определению будут иметь высоту 480 пикселей при создании в Интерфейсном Разработчике, так что это то, что вы видите при инициализации представления.Как только представление будет правильно инициализировано и добавлено в стек представлений, оно будет изменено в соответствии с фактическим доступным пространством.

Вы просто запрашиваете представление о его высоте до того, как оно было отрегулировано.Попробуйте прочитать высоту в viewDidLoad, тогда она должна быть правильной.

0 голосов
/ 03 августа 2011

Да, это правильно, потому что экземпляр UINavigationController объявлен в вашем (Delegate.h) и что навигационная панель добавлена ​​в окно , а не в self.view

Когда вы проверяете границы вашего текущего вида, он обязательно должен вернуть 320 * 480. Он не должен включать высоту панели навигации в вашем представлении, так как это не в этом представлении. Это на окне.

...