Пользовательские цвета в UITabBar

Можно ли использовать пользовательские цвета и фоновые изображения в UITabBar? Я понимаю, что Apple хотела бы, чтобы все использовали те же синие и серые панели вкладок, но есть ли способ настроить это?

Во-вторых, даже я должен был создать свой собственный controller отображения в виде TabBar, а также пользовательские изображения, нарушив руководство Apple по интерфейсу пользователя?

Я нашел ответ на этот вопрос в Silent Mac Design .

Я реализовал этот путь:

Сначала создайте подclass UITabBarContoller

// CustomUITabBarController.h #import  @interface CustomUITabBarController: UITabBarController { IBOutlet UITabBar *tabBar1; } @property(nonatomic, retain) UITabBar *tabBar1; @end 

 // CustomUITabBarController.m #import "CustomUITabBarController.h" @implementation CustomUITabBarController @synthesize tabBar1; - (void)viewDidLoad { [super viewDidLoad]; CGRect frame = CGRectMake(0.0, 0, self.view.bounds.size.width, 48); UIView *v = [[UIView alloc] initWithFrame:frame]; [v setBackgroundColor:[[UIColor alloc] initWithRed:1.0 green:0.0 blue:0.0 alpha:0.1]]; [tabBar1 insertSubview:v atIndex:0]; [v release]; } @end - // CustomUITabBarController.m #import "CustomUITabBarController.h" @implementation CustomUITabBarController @synthesize tabBar1; - (void)viewDidLoad { [super viewDidLoad]; CGRect frame = CGRectMake(0.0, 0, self.view.bounds.size.width, 48); UIView *v = [[UIView alloc] initWithFrame:frame]; [v setBackgroundColor:[[UIColor alloc] initWithRed:1.0 green:0.0 blue:0.0 alpha:0.1]]; [tabBar1 insertSubview:v atIndex:0]; [v release]; } @end 

И в вашем файле Nib замените class вашего controllerа TabBar на CustomUITabBarController.

FYI, начиная с iOS 5, вы можете настроить различные аспекты UITabBar, включая настройку фонового изображения с использованием свойства backgroundImage .

Новые свойства UITabBar «Настройка внешнего вида» в iOS 5:

 backgroundImage selectedImageTintColor selectionIndicatorImage tintColor 

Учитывая, что Apple внедрила эти методы в iOS 5, возможно, они могут более сочувствовать попыткам настроить UITabBar для более ранних ОС. На этом веб-сайте говорится, что приложение Twitter использует настраиваемую панель вкладок, поэтому может быть больше оснований полагать, что Apple выпустит такое приложение в App Store, но это не гарантия!

Используйте следующие изображения (Предположим, tabBar имеет 5 вкладок следующим образом)

  • введите описание изображения здесь
  • введите описание изображения здесь
  • введите описание изображения здесь
  • введите описание изображения здесь
  • введите описание изображения здесь

Создайте новый проект, используя шаблон «TabBar Application» и разместите следующий код.

Содержимое файла AppDel.h.

 #import  @interface cTabBarAppDelegate : NSObject  { } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UITabBarController *tabBarController; @property (nonatomic, retain) IBOutlet UIImageView *imgV; @end 

Содержимое файла AppDel.m.

 #import "cTabBarAppDelegate.h" @implementation cTabBarAppDelegate @synthesize window=_window; @synthesize tabBarController=_tabBarController; @synthesize imgV = _imgV; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.tabBarController.delegate=self; self.imgV.frame=CGRectMake(0, 425, 320, 55); [self.tabBarController.view addSubview:self.imgV]; self.tabBarController.selectedIndex=0; self.window.rootViewController = self.tabBarController; [self.window makeKeyAndVisible]; return YES; } - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{ NSUInteger index=[[tabBarController viewControllers] indexOfObject:viewController]; switch (index) { case 0: self.imgV.image=[UIImage imageNamed:@"tBar1.png"]; break; case 1: self.imgV.image=[UIImage imageNamed:@"tBar2.png"]; break; case 2: self.imgV.image=[UIImage imageNamed:@"tBar3.png"]; break; case 3: self.imgV.image=[UIImage imageNamed:@"tBar4.png"]; break; case 4: self.imgV.image=[UIImage imageNamed:@"tBar5.png"]; break; default: break; } return YES; } 

В начале *** ViewController.m добавить следующее может помочь установить фоновое изображение UITabBar.

 @implementation UITabBar (CustomImage) - (void)drawRect:(CGRect)rect { UIImage *image = [UIImage imageNamed: @"background.png"]; [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; } @end 

Если вы хотите использовать пользовательские цвета для значков (а не только для фона) вместо серых и синих по умолчанию, сделайте это так: http://blog.theanalogguy.be/2010/10/06/custom-colored- uitabbar-иконки /

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

И Apple не будет возражать, поскольку мы не используем какие-либо частные API.

Начиная с iOS 7.0, вы можете использовать – [UIImage imageWithRenderingMode:] с UIImageRenderingModeAlwaysOriginal для сохранения цветов:

 // Preserve the colors of the tabs. UITabBarController *controller = (UITabBarController *)((UIWindow *)[UIApplication sharedApplication].windows[0]).rootViewController; NSArray *onIcons = @[ @"tab1-on", @"tab2-on", @"tab3-on" ]; NSArray *offIcons = @[ @"tab1-off", @"tab2-off", @"tab3-off" ]; NSArray *items = controller.tabBar.items; for (NSUInteger i = 0; i < items.count; ++i) { UITabBarItem *item = items[i]; item.image = [[UIImage imageNamed:offIcons[i]] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; item.selectedImage = [[UIImage imageNamed:onIcons[i]] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; } 

Работает как шарм.

В AppDelegate.m

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[UITabBar appearance] setSelectedImageTintColor:[UIColor redColor]]; return YES; } 

Что касается classа UITabBar, значки на панели ограничены цветами: синий для выбранных и серый для невыбранных. Это связано с тем, что на панели вкладок используется только альфа-значение из значков, которые вы указываете для создания изображения на панели.

Насколько я помню, сам бар ограничен черным. Я не видел ничего похожего на свойство tint на UINavigationBar в документах.

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

По моему опыту, Apple рецензенты отклонили мое приложение, если я не использовал их элементы UI в соответствии с HIG. Они могут иметь другое представление, когда это ваши собственные элементы пользовательского интерфейса, с которыми вы играете.

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

https://developer.apple.com/iphone/library/documentation/UserExperience/Conceptual/MobileHIG/IconsImages/IconsImages.html#//apple_ref/doc/uid/TP40006556-CH14-SW1

Под заголовками значков для навигационных баров, панелей инструментов и вкладок

Это возможно без добавления subView.

В classе, где вы определяете панель вкладок, задано свойство tabBarItem – >>

 UITabBarItem *tabBarItem1 = [[self.tabBar.tabBar items] objectAtIndex:0]; [tabBarItem1 setFinishedSelectedImage:[UIImage imageNamed:@"campaigns_hover.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"campaigns.png"]]; 

Свойство tabBarItem и u может изменить голубое изображение по умолчанию на пользовательский образ. campaign_hover.png – это выбранный пользовательский образ, а campaigns.png – это настраиваемый образ, если он не выбран …

Наслаждайся секретом .. 🙂

Следующий код помогает добавить пользовательские цвета с значениями RGB в ur tabBar.

 self.tabBarController.tabBar.tintColor = [[UIColor alloc] initWithRed:0.00 green:0.62 blue:0.93 alpha:1.0]; 

Вы можете сделать это без -insertSubview:atIndex , потому что новый UIView не нужен. Вы можете применить тему, используя QuartzCore для каждого представления (UITabBar и его подвид). Таким образом, фон UITabBar добавлен, как я описал здесь .

Теперь мы должны применить изображение на каждом UITabBarItem, поскольку это фон:

  // UITabBar+CustomItem.h #import  #import  @interface UITabBar (CustomItem) -(void)setSelectedItemBackground:(UIImage *)backgroundImage; @end 

Теперь файл .m:

  // UITabBar+CustomItem.m @implementation UITabBar (CustomItem) #define kItemViewTag 445533 // <-- casual number #define kItemViewOldTag 445599 // <-- casual number different from the above -(void)setSelectedItemBackground:(UIImage *)backgroundImage { UIView *oldView = [self viewWithTag:kImageViewItemTag]; oldView.layer.contents = nil; // <-- remove the previous background oldView.tag = kItemViewOldTag; // <-- this will avoid problems NSUInteger index = [self.items indexOfObject:self.selectedItem]; UIView *buttonView = [self.subviews objectAtIndex:index]; buttonView.tag = kItemViewTag; buttonView.layer.contents = (id)backgroundImage.CGImage; // <-- add // the new background } @end 

Вы также можете изменить цвет выбранных изображений, как это сделал кто-то здесь . Но мне интересно: можно ли изменить цвет выбранной метки? Ответ да, как описано ниже (следующие работы на ios 3.x / 4.x, а не iOS5 +):

  @implementation UITabBar (Custom) #define kSelectedLabel 334499 // <-- casual number -(void)changeCurrentSelectedLabelColor:(UIColor *)color { UIView *labelOldView = [self viewWithTag:kSelectedLabel]; [labelOldView removeFromSuperview]; NSString *selectedText = self.selectedItem.title; for(UIView *subview in self.subviews) { if ([NSStringFromClass([subview class]) isEqualToString:@"UITabBarButton"]) { for(UIView *itemSubview in subview.subviews) { if ([itemSubview isKindOfClass:[UILabel class]]) { UILabel *itemLabel = (UILabel *)itemSubview; if([itemLabel.text isEqualToString:selectedText]) { UILabel *selectedLabel = [[UILabel alloc] initWithFrame:itemLabel.bounds]; selectedLabel.text = itemLabel.text; selectedLabel.textColor = color; selectedLabel.font = itemLabel.font; selectedLabel.tag = kSelectedLabel; selectedLabel.backgroundColor = [UIColor clearColor]; [itemSubview addSubview:selectedLabel]; [selectedLabel release]; } } } } } } @end 
  • Как отобразить изображение base64 в UIImageView?
  • Стилизация кнопки отмены в UISearchBar
  • Автоматически запускать локальные уведомления ежедневно в динамическое время, заданное в массивах. objective ios
  • Круглое двойное значение до 2 знаков после запятой
  • iPhone: как передавать данные между несколькими Viewcontrollers в приложении Tabbar
  • Добавление изображений в кнопки UIActionSheet, как в UIDocumentInteractionController
  • objective @ Символ перед строк?
  • CALayer: добавить границу только с одной стороны
  • Как обрабатывать дублируемую символьную ошибку от сторонних библиотек?
  • Очереди отправки: как узнать, запущены ли они и как их остановить
  • viewDidLoad в NSViewController?
  • Давайте будем гением компьютера.