Как я уже говорил в другом месте, почти никогда хорошая идея, чтобы избавиться от основных навигационных классов, предоставляемых UIKit
.Какой тип требований к приложениям у вас, по вашему мнению, заслуживает полностью настраиваемого класса панели вкладок?Почти всегда можно добиться необходимых настроек путем создания подклассов, категоризации или использования слоев.
ОБНОВЛЕНИЕ 1 : Итак, вот что я сделал в некоторых из моих приложений, чтобы получить пользовательскийРеализация панели вкладок.
- Создайте подкласс из
UITabBar
- Добавьте метод к вашему пользовательскому подклассу, который называется что-то вроде
-updateTabBarImageForViewControllerIndex:
- В Интерфейсном Разработчике изменитекласс панели вкладок контроллера панели вкладок для вашего пользовательского подкласса
- В любом классе, соответствующем делегату контроллера панели вкладок (например, делегату приложения), внедрите
-tabBarController:shouldSelectViewController:
и вызовите -updateTabBarImageForViewControllerIndex:
на своей пользовательской вкладкеподкласс bar
По сути, вы хотите уведомлять подкласс панели вкладок каждый раз, когда контроллер панели вкладок собирается переключать контроллеры представления.Когда это произойдет, определите, какое изображение вам нужно выбрать для панели вкладок.У вас должно быть n
изображений для панели вкладок, по одному для выбранного состояния каждой вкладки.Можно на самом деле сфальсифицировать реализацию UITabBarItem
и просто работать с отдельными изображениями, но это немного больше работы.
// MyAppDelegate.m
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
// Determine the index based on the selected view controller
NSUInteger viewControllerIndex = ...;
[(MyTabBar *)tabBarController.tabBar updateTabBarImageForViewControllerIndex:viewControllerIndex];
return YES;
}
// MyTabBar.m
- (void)updateTabBarImageForViewControllerIndex:(NSUInteger)index
{
// Determine the image name based on the selected view controller index
self.selectedTabBarImage = [UIImage imageNamed:...];
[self setNeedsDisplay];
}
- (void)drawRect:(CGRect)rect
{
CGContextDrawImage(UIGraphicsGetCurrentContext(), rect, self.selectedTabBarImage.CGImage);
}
ОБНОВЛЕНИЕ 2 : Теперь, когда я думаю об этом большеВы могли бы (и должны) получить то, чего пытаетесь достичь, вообще не имея подкласса UITabBar
.Импортируйте <QuartzCore/QuartzCore.h>
и используйте содержимое слоя.:)
// MyAppDelegate.m
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
// Determine the image name based on the selected view controller
CGImageRef newTabBarImageRef = [[UIImage imageNamed:...] CGImage];
tabBarController.tabBar.layer.contents = (id)newTabBarImageRef;
return YES;
}