Я экспериментировал с этим и определил, что 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];
Это должно гарантировать, что вы поднимаете голову каждый раз, когда что-то вызывает изменение геометрии панели вкладок. Получив эти обратные вызовы, вы можете вызывать свой собственный метод для каждого из них и изменять размер панели вкладок по своему усмотрению, без необходимости создавать подклассы.