Внешний вид UITabBarSelectionIndicatorImage не работает при первом запуске iOS7

У меня есть настроенный UITabBar и используйте следующий код в AppDelegate:

- (void)tabBarController:(MainUITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
[self customizeTabBar];
}


- (void)customizeTabBar {

    NSLog(@"*******customizeTabBar*******");
    UIImage *tabBackground = [[UIImage imageNamed:@"unselectedtab"]
                  resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
    // Set background for all UITabBars
    [[UITabBar appearance] setBackgroundImage:tabBackground];
    // Set tint color for the images for all tabbars
    [[UITabBar appearance] setSelectedImageTintColor:[UIColor whiteColor]];
    // Set selectionIndicatorImage for all tabbars
    [[UITabBar appearance] setSelectionIndicatorImage:[UIImage imageNamed:@"selectedtab"]];

} 

- (void)tabBarController:(MainUITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed
{
    NSLog(@"*******didEndCustomizingViewControllers*******");
}

Все в порядке в iOS5 +, но в 7 при первой загрузке первого TabBarItem индикатор элемента белый, и кнопка, похоже, была выбрана, но изображение "selectedTab" не загружено.

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

customizeTabBar вызывается, но выбранное изображение не появляется при первом запуске.

didEndCustomizingViewControllers, похоже, вообще не вызываются.

Это не работает в эмуляторе или устройстве на iOS7, но работает на iOS5, 6.

Любые идеи? Спасибо заранее.

Ответы

Ответ 1

Устанавливая изображение индикатора выбора для панели вкладок прямо еще раз, кроме того, чтобы делать это по внешнему виду, работал у меня!

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ....

    UITabBarController *tabBarContr = (UITabBarController *)self.window.rootViewController;
    ...
    [[UITabBar appearance] setSelectionIndicatorImage:[UIImage imageNamed:@"tab_bar_selection_indicator.png"]];

    // iOS7 hack: to make selectionIndicatorImage appear on the selected tab on the first app run
    [[tabBarContr tabBar] setSelectionIndicatorImage:[UIImage imageNamed:@"tab_bar_selection_indicator.png"]];

    return YES;
}

Ответ 2

Я вижу эту ту же самую проблему. Вот мой didFinishLaunching

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self applyStyleSheet];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    self.window.backgroundColor = [UIColor redColor];
    self.window.tintColor = [UIColor whiteColor];
    UITabBarController *tabBarController = [self setupTabBarController];
    self.window.rootViewController = tabBarController;
    [self.window makeKeyAndVisible];

    return YES;
}

Вот как я настраиваю панель вкладок:

- (UITabBarController *)setupTabBarController
{
    UITabBarController *tabBarController = [[UITabBarController alloc] init];
    UINavigationController *nav1 = [[UINavigationController alloc] initWithRootViewController:[[FirstViewController alloc] init]];
    UINavigationController *nav2 = [[UINavigationController alloc] initWithRootViewController:[[SecondViewController alloc] init]];
    UINavigationController *nav3 = [[UINavigationController alloc] initWithRootViewController:[[ThirdViewController alloc] init]];
    UINavigationController *nav4 = [[UINavigationController alloc] initWithRootViewController:[[FourthViewController alloc] init]];
    UINavigationController *nav5 = [[UINavigationController alloc] initWithRootViewController:[[FifthViewController alloc] init]];
    [tabBarController setViewControllers:@[nav1, nav2, nav3, nav4, nav5]];

    return tabBarController;
}

И, наконец, это блок настройки панели вкладок:

- (void)applyStyleSheet
{
    UITabBar *tabBar = [UITabBar appearance];
    [tabBar setBackgroundImage:[UIImage imageWithColor:[UIColor redColor]]];
    [tabBar setTintColor:[UIColor whiteColor]];
    [tabBar setSelectionIndicatorImage:[UIImage imageNamed:@"tab-selected"]];
    [tabBar setSelectedImageTintColor:[UIColor whiteColor]];
}

Как указано, на первой вкладке не загружается изображение с вкладкой. Тем не менее, я добавил следующую строку после [self.window makeKeyAndVisible], чтобы моя вкладка запускалась с другой вкладкой, и на этой вкладке появилось изображение с табуляцией:

    [tabBarController setSelectedIndex:1];

Итак, здесь мой финализированный файл didFinishLaunching с тонким взломом, который заставляет его работать:)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        [self applyStyleSheet];
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
        self.window.backgroundColor = [UIColor redColor];
        self.window.tintColor = [UIColor whiteColor];
        UITabBarController *tabBarController = [self setupTabBarController];
        self.window.rootViewController = tabBarController;
        [self.window makeKeyAndVisible];
        [tabBarController setSelectedIndex:1];
        [tabBarController setSelectedIndex:0];

        return YES;
    }

Ответ 3

ОК.

не самый лучший из исправлений, но нужно отправить.

Измените код настройки в appdelegate и в файле xib проектов (это старый проект) в инспекторе атрибутов TabBars (с использованием xcode 5) - добавьте фоновый фон и выбор изображений вкладок.

Это работает для ios7 без необходимости какого-либо кода настройки в appdelegate.

Для pre iOS5 + 6 (это приложение поддерживает только 5+), однако нам все равно нужен код, поэтому я добавил простую проверку для версии и сохранил код как есть:

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

if(SYSTEM_VERSION_LESS_THAN(@"7.0"))

    {

        UIImage *tabBackground = [[UIImage imageNamed:@"unselectedtab"]

                                  resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];

        // Set background for all UITabBars

        [[UITabBar appearance] setBackgroundImage:tabBackground];
    [[UINavigationBar appearance] setTintColor:[UIColor blackColor]];

    // Set tint colour for the images for all tabbars

    [[UITabBar appearance] setSelectedImageTintColor:[UIColor whiteColor]];

    // Set selectionIndicatorImage for all tabbars

    [[UITabBar appearance] setSelectionIndicatorImage:nil];

    [[UITabBar appearance] setSelectionIndicatorImage:[UIImage imageNamed:@"selectedtab.png"]];

}

Ответ 4

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

Здесь, как я понял, мы все использовали StoryBoards и не смогли интегрировать этот Segues в наш код!:) Поэтому я выбираю , чтобы не возиться с кодом, после того как я попробовал больше всего ответов StackOverFlow относительно этого!:) Потому что, почему вы хотите сделать это, когда вы предоставили Goody Good Конструктор интерфейсов (IB) и Инструмент для раскрутки рассказов?

Вопрос:
Когда мы установили выбранное изображение вкладки, фоновое изображение специально для панели вкладок, оно не показывает, какая вкладка выбрана с изображением, которое мы установили в нашем коде...???

Решение
Ниже приведены скриншоты моих настроек StoryBoard, которые я сделал для решения этой проблемы.

Выберите вкладку TabBarController на панели контура вашего документа:
Select your TabBarController from your via document outline panel

Задайте настройки панели вкладок на панели "Утилиты":
Set your settings for the Tab Bar from the Utilities Panel

Затем ваша программа настроена на запуск! Теперь он знает, что первая вкладка выбирается, когда приложение сначала показывает первый вкладку, а также какое изображение должно отображаться для всех индикаторов панели вкладок, когда каждый из них выбран!:)
надеюсь, что у вас есть ключ! Если бы я помог тебе, я счастлив!!! Но если я потратил впустую ваше время, я так жаль!!!:( Но поверьте мне, это сработало мне как шарм!!!

Ответ 5

- (void)customizeTabBar {

 UIImageView *customizeTabBar = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,320.0,50)];
customizeTabBar.image=[UIImage imageNamed:@"Tab_bar.png"];

firstTab = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tab1.png"] highlightedImage:[UIImage imageNamed:@"tab11.png"]];
[firstTab setFrame:CGRectMake(8.0,01.0,90.0,49.0)];
[customizeTabBar addSubview: firstTab];

secondTab = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tab2"] highlightedImage:[UIImage imageNamed:@"tab22"]];
[secondTab setFrame:CGRectMake(115.0,01.0,90.0,49.0)];
[customizeTabBar addSubview: secondTab];

thirdTab = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tab3"] highlightedImage:[UIImage imageNamed:@"tab33"]];
[thirdTab setFrame:CGRectMake(223.0,01.0,90.0,49.0)];
[customizeTabBar addSubview: thirdTab];
self.tabBar.tag=10;
[self.tabBar addSubview:customizeTabBar];

}