Размещение и определение размеров подвидов в UIViewController - PullRequest
48 голосов
/ 10 января 2010

У меня есть приложение с UITabController, и каждая вкладка - UINavigationController. Корень одного из моих UINavigationControllers - это UIViewController.

Внутри этого контроллера представления я хочу расположить некоторые подпредставления, но я не понимаю, где и как их расположить так, чтобы они не зависели от разрешения (т. Е. Не были жесткими значениями кода, такими как 320px, 480px, 44px и т. д.).

Когда представление полностью загружено и представлено на вертикальном iPhone, его высота будет 367px = 480 - 20 (строка состояния) - 44 (панель навигации) - 49 (панель вкладок).

Внутри контроллера представления я в настоящее время создаю все свои подпредставления в методе viewDidLoad. Однако, похоже, что в этом методе текущая высота представления составляет 460 пикселей (self.view.bounds.size.height). Поэтому при настройке своих подпредставлений я не могу правильно рассчитать размеры чего-либо.

В методе viewWillAppear: представление знает , что оно имеет правильный размер, но это будет означать установку и вычисление кадров подпредставления каждый раз, когда представление будет отображаться (например, изменение табуляции или извлечение из контроллеров дочернего представления в стеке навигации.

Это единственный способ сделать это правильно для макета в viewWillAppear:?

Я пытался использовать свойства авторазмера (родительские autoresizesSubviews & autoresizingMask), но, похоже, они вообще не работают !? Действуют ли они только после того, как все представление настроено, а затем изменено его размер (вручную / изменение ориентации?).

Буду признателен, если кто-нибудь сообщит мне, почему авторазмер не работает, и как лучше всего разобраться, не задавая жесткие размеры.

Ответы [ 2 ]

43 голосов
/ 30 апреля 2014

Вы можете сделать свою логику макета внутри viewWillLayoutSubviews из UIViewController.

-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    // Your layout logic here
}

DOC: Вызывается непосредственно перед вызовом метода layoutSubviews представления контроллера представления. Подклассы могут реализовывать по мере необходимости. По умолчанию используется nop.

33 голосов
/ 11 января 2010

autoresizesSubviews должно быть установлено в родительском представлении, в то время как autoresizingMask должно быть установлено в дочерних представлениях - это ошибка, которую я сделал, чтобы вы тоже могли.

В loadView вы должны изменить размер ваших подпредставлений так, чтобы они соответствовали размеру родительского представления в данный момент, а затем, когда размер родительского представления будет изменен с 460 до 367 пикселей, ваши подпредставления также будут изменены в соответствии ваши настройки маски выше.

Если это не удастся, нет ничего плохого в настройке размера представления в пределах viewWillAppear - влияние на производительность при выполнении этого каждый раз незначительно.

Если больше ничего не работает, всегда есть layoutSubviews: - там вы можете сделать макет вручную, если нужно, он вызывается, когда система считает, что компоновка может измениться. есть также setNeedsLayout: который я иногда вызываю из viewWillRotate: / viewDidRotate: и т. д. Но на самом деле это не нужно, и авторазмер должен быть достаточно хорошим.

РЕДАКТИРОВАТЬ: Да, для реализации пользовательской логики макета в layoutSubviews, как я уже упоминал выше, необходимо создать подкласс UIView.

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