Как я уже говорил в другом месте, почти никогда не было хорошей идеей, чтобы избавиться от основных навигационных классов, которые предоставляются UIKit
. Какие у вас требования к приложениям, которые, по вашему мнению, заслуживают полностью настраиваемого класса панели вкладок? Почти всегда можно добиться необходимых настроек путем подкласса, категоризации или использования слоев.
ОБНОВЛЕНИЕ 1: Вот что я сделал в некоторых своих приложениях, чтобы получить пользовательскую реализацию панели вкладок.
- Создать подкласс
UITabBar
- Добавить метод к пользовательскому подклассу называется что-то вроде
-updateTabBarImageForViewControllerIndex:
- В Interface Builder, изменить класс панели вкладок вашей панели вкладок контроллера к пользовательскому подклассу
- В независимо от того, какой класс соответствует вашему делегату контроллера панели вкладок (например, делегат вашего приложения), выполните
-tabBarController:shouldSelectViewController:
и позвоните по номеру -updateTabBarImageForViewControllerIndex:
в свой собственный подкласк панели вкладок
В принципе, вы хотите уведомлять свой подкласбу панели вкладок каждый раз, когда контроллер панели вкладок собирается переключить контроллеры представлений. Когда это произойдет, определите, какое изображение нужно выбрать для панели вкладок. У вас должно быть 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);
}
UPDATE 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;
}
На самом деле, что касается UITabBar [Controller], Apple действительно не нравится, если вы подклассифицируете его. Это можно сделать, но вы часто терпите неудачу в наборе assert(), который у них есть, чтобы остановить вас. Когда я спросил об этом на форумах dev, ответ был «Roll your own». (Я так и не сделал этого, но на пути была боль и страдания.) –
Нет ничего плохого в подклассе, если все, что вы собираетесь делать, это настроить стиль, переопределив '-drawRect:', например , Да, вы не хотите переопределять какие-либо методы, которые изменяют базовую логику, но нет вреда в подклассе, если вы делаете это правильно. В любом случае, я рекомендую использовать слои только в том случае, если это возможно. Никаких подклассов или категоризации не требуется. – LucasTizma
Лукас. Мне нужно изменить цвет наложения и цвет текста. Из того, что я видел, это может отказать моему приложению. –