Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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 вкладок, как показано ниже)

  • enter image description here
  • enter image description here
  • enter image description here
  • enter image description here
  • enter image description here

Создайте новый проект, используя шаблон "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