Пользовательские цвета в UITabBar
Можно ли использовать пользовательские цвета и фоновые изображения в UITabBar? Я понимаю, что Apple хочет, чтобы все использовали те же синие и серые полосы вкладок, но есть ли способ настроить это?
Во-вторых, даже я должен был создать свой собственный контроллер отображения в виде TabBar вместе с пользовательскими изображениями, нарушив Руководства по человеческому интерфейсу Apple?
Ответы
Ответ 1
Я нашел ответ на это в Silent Mac Design.
Я реализовал этот способ:
Сначала создайте подкласс UITabBarContoller
// CustomUITabBarController.h
#import <UIKit/UIKit.h>
@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
И в вашем файле Nib замените класс вашего контроллера TabBar на CustomUITabBarController.
Ответ 2
FYI, начиная с iOS 5, вы можете настроить различные аспекты UITabBar, включая установку его фонового изображения с помощью свойства backgroundImage.
Новый UITabBar Свойства "Настройка внешнего вида" в iOS 5:
backgroundImage
selectedImageTintColor
selectionIndicatorImage
tintColor
Учитывая, что Apple представила эти методы в iOS 5, возможно, они могут быть более сочувствующими попыткам настроить UITabBar для более ранних ОС. Этот веб-сайт говорит, что приложение Twitter использует настраиваемую панель вкладок, поэтому может быть больше оснований полагать, что Apple выпустит такое приложение в App Store, это нет гарантии, хотя!
Ответ 3
Используйте следующие изображения (Предполагая, tabBar имеет 5 вкладок, как показано ниже)
Создайте новый проект, используя шаблон "TabBar Application" и разместите следующий код.
Содержимое файла AppDel.h.
#import <UIKit/UIKit.h>
@interface cTabBarAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> {
}
@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;
}
Ответ 4
В начале *** 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
Ответ 5
Если вы хотите использовать пользовательские цвета для значков (а не только для фона) вместо серых и синих по умолчанию, сделайте это так: http://blog.theanalogguy.be/2010/10/06/custom-colored-uitabbar-icons/
В принципе, вам нужно создать полные изображения в виде вкладок (фон, значки и текст) для каждой выбранной вкладки и установить UITabBarItems без значка и без заголовка и вставить изображение в панель в виде UIImageView в viewWillAppear:
И Apple не будет возражать, поскольку мы не используем какие-либо частные API.
Ответ 6
С 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];
}
Работает как шарм.
Ответ 7
В AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[UITabBar appearance] setSelectedImageTintColor:[UIColor redColor]];
return YES;
}
Ответ 8
Что касается класса UITabBar, значки на панели ограничены цветами: синий для выбранных и серый для невыделенных. Это связано с тем, что на панели вкладок используется только альфа-значение из значков, которые вы указываете для создания изображения на панели.
Сам бар ограничивается черным, насколько я помню. Я не видел ничего похожего на свойство tint на UINavigationBar в документах.
Думаю, вы могли бы продолжить свой собственный стиль стилей в стиле табуляции и делать с ним то, что хотите, но я абсолютно не знаю, как это вписывается в Apple HIG, или они будут бросать вызов ему во время процесса обзора.
По моему опыту, Apple рецензенты отклонили мое приложение, если я не использовал их элементы UI в соответствии с HIG. Они могут иметь другое представление, когда у вас есть собственные элементы пользовательского интерфейса, с которыми вы играете.
Ответ 9
Здесь документ, в котором говорится, что мы не можем изменить нажатый или выбранный вид с помощью наших значков.
https://developer.apple.com/iphone/library/documentation/UserExperience/Conceptual/MobileHIG/IconsImages/IconsImages.html#//apple_ref/doc/uid/TP40006556-CH14-SW1
Это под заголовком
Иконки для навигационных баров, панелей инструментов и вкладок
Ответ 10
Это возможно без добавления какого-либо подвид.
В классе, в котором вы определяете панель вкладок, задано свойство
tabBarItem to → >
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 - это настраиваемый образ, если он не выбран...
Наслаждайся секретом..:)
Ответ 11
В приведенном ниже коде вы можете добавить пользовательские цвета с значениями RGB в ur tabBar.
self.tabBarController.tabBar.tintColor = [[UIColor alloc] initWithRed:0.00
green:0.62
blue:0.93
alpha:1.0];
Ответ 12
Вы можете сделать это без -insertSubview:atIndex
, потому что новый UIView не нужен. Вы можете применить тему, используя QuartzCore для каждого представления (UITabBar и его подпункты). Таким образом, фон UITabBar добавлен, как я описал здесь.
Теперь мы должны применить изображение на каждом UITabBarItem в качестве фона:
// UITabBar+CustomItem.h
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
@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