Подкласс UITabBarController для настройки своего кадра - PullRequest
3 голосов
/ 29 ноября 2009

У меня возникают некоторые проблемы с изменением размера UITabBarController, так как я хочу, чтобы он занимал только нижнюю половину экрана. Кажется, заставляет себя отображать полную высоту экрана (минус строка состояния, если отображается).

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

Я попытался установить для UIWindow (к которому добавлен контроллер панели вкладок) значение autoresizesSubviews:NO и для autoresizingMask:UIViewAutoresizingNone панели вкладок, но это не сработало!

Любая помощь будет принята с благодарностью!

1 Ответ

4 голосов
/ 29 ноября 2009

Я экспериментировал с этим и определил, что tabBarController автоматически изменит размер своего представления и отменит все ваши изменения, когда произойдет любое из следующего:

  • значение выбранного ViewController изменяется;
  • изменения ориентации интерфейса;
  • панель вкладок (пере) загружается и помещается внутри вида / окна.

Мне удалось заставить представление UITabBar оставаться неизменным, зарегистрировавшись для всех перечисленных выше событий и затем вызвав из них пользовательский метод изменения размера.

Вы можете наблюдать изменения в выбранном ViewController с помощью KVO, например:

[tabBarController addObserver:self forKeyPath:@"selectedViewController" options:NSKeyValueObservingOptionNew context:NULL]

Наблюдать за изменениями в ориентации интерфейса может быть немного сложно. Если вы делаете это из своего делегата приложения или другого объекта, предназначенного для этой цели, скорее всего, вы не получаете стандартные обратные вызовы UIViewController для изменения ориентации между объектами. Есть два способа обойти это: (1) UIDevice и уведомления и (2) получение одного из ваших контроллеров представления для генерации обратного вызова. Лично я бы порекомендовал последнее, так как уведомления UIDevice, как правило, на несколько микросекунд не синхронизированы с интерфейсом, и результат может выглядеть неровно. Упрощенная реализация:

// In a header somewhere (Prefix.pch works).

extern NSString *const kOrinetationNotification;
extern NSString *const kOrinetationNotificationOrientationKey;

// in an instance of UIViewController

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
  [[NSNotificationCenter defaultCenter] postNotificationName:kOrientationNotification object:self userInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:toInterfaceOrientation] forKey:kOrientationNotificationOrientationKey]];
  // do other stuff
}

// in your application delegate's (or other dedicated object) init method

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationDidChange:) name:kOrientationNotification object:nil];

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

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