TabBarItem图标在iOS 8中不能立即显示

6

我对tabBarItem图标有问题。这是我的storyboard的一部分截图。

Storyboard

有一个基本的viewController和一些按钮。当其中一个按钮被点击时,会出现具有三个选项卡的tabBarController。iOS 8中,tabBarItems的图标最初不会出现。如果我更改了viewController,先前和当前viewController的所有图标都会出现。如果我选择第三个选项卡,则所有tabBarItems的图标都会出现。以下是我问题的截图:

TabBarController第一次出现:

1st

如果我更改选项卡:

2nd

这是在TabBarController的第一个viewController的viewDidLoad方法中设置tabBarItems图标的代码(所有图标都为30x30):

[[[self.tabBarController.viewControllers objectAtIndex:0] tabBarItem]  setFinishedSelectedImage:[UIImage imageNamed:@"1d1.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"1b1.png"]];

[[[self.tabBarController.viewControllers objectAtIndex:1] tabBarItem]  setFinishedSelectedImage:[UIImage imageNamed:@"2d1.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"2b1.png"]];

[[[self.tabBarController.viewControllers objectAtIndex:2] tabBarItem]  setFinishedSelectedImage:[UIImage imageNamed:@"3d1.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"3b1.png"]];

这里是 iOS 7 正常运行的截图:

right

有人能帮我解决这个问题吗?


你也在设备上试过了吗? - HAS
@HAS 我还没有在设备上尝试,因为我目前没有iOS 8的设备。你认为模拟器可能会导致这个问题吗?但为什么只有iOS 8的模拟器会出现这个问题呢? - hoya21
所有的模拟器都时常存在着各种问题(当然,这是夸张了,但当出现问题时,你永远不能轻信它)。 - HAS
1
@HAS 哈哈,你说得对。我将在接下来的几天内在iOS 8设备上运行我的应用程序,并告知你模拟器是否会引起问题。 - hoya21
4个回答

7

在经过几个小时的搜索和阅读不同的答案,包括@Zala的回答后,在TabBarController的第一个viewController的viewDidLoad中加入以下代码,才取得了巨大的成功。

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
{

    UITabBarItem *tabBarItem = [self.tabBarController.tabBar.items objectAtIndex:0];

    UIImage *unselectedImage = [UIImage imageNamed:@"1b1.png"];
    UIImage *selectedImage = [UIImage imageNamed:@"1d1.png"];

    [tabBarItem setImage: [unselectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
    [tabBarItem setSelectedImage:[selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];


    UITabBarItem *tabBarItem1 = [self.tabBarController.tabBar.items objectAtIndex:1];

    UIImage *unselectedImage1 = [UIImage imageNamed:@"2b1.png"];
    UIImage *selectedImage1 = [UIImage imageNamed:@"2d1.png"];

    [tabBarItem1 setImage: [unselectedImage1 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
    [tabBarItem1 setSelectedImage: [selectedImage1 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];

    UITabBarItem *tabBarItem2 = [self.tabBarController.tabBar.items objectAtIndex:2];

    UIImage *unselectedImage2 = [UIImage imageNamed:@"3b1.png"];
    UIImage *selectedImage2 = [UIImage imageNamed:@"3d1.png"];

    [tabBarItem2 setImage: [unselectedImage2 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
    [tabBarItem2 setSelectedImage:[selectedImage2 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];


    [tabBarItem setTitle:@"Φωτογραφίες"];

    [tabBarItem2 setTitle:@"360° Φωτογραφία"];

    [tabBarItem1 setTitle:@"Βίντεο"];



}
else
{


    [[[self.tabBarController.viewControllers objectAtIndex:0] tabBarItem]  setFinishedSelectedImage:[UIImage imageNamed:@"1d1.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"1b1.png"]];


    [[[self.tabBarController.viewControllers objectAtIndex:1] tabBarItem]  setFinishedSelectedImage:[UIImage imageNamed:@"2d1.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"2b1.png"]];
    [[[self.tabBarController.viewControllers objectAtIndex:2] tabBarItem]  setFinishedSelectedImage:[UIImage imageNamed:@"3d1.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"3b1.png"]];

    [[[self.tabBarController.viewControllers objectAtIndex:0] tabBarItem] setTitle:@"Φωτογραφίες"];

    [[[self.tabBarController.viewControllers objectAtIndex:2] tabBarItem] setTitle:@"360° Φωτογραφία"];

    [[[self.tabBarController.viewControllers objectAtIndex:1] tabBarItem] setTitle:@"Βίντεο"];



}

5

setFinishedSelectedImage:withFinishedUnselectedImage:已从iOS 7开始弃用,请使用UITabBarItemimageselectedImage属性来替代。

设置自定义图像的方法如下:

UITabBarItem *tabBarItem1 = [tabBar.items objectAtIndex:0];

if ([self iOS7OrAbove])
{
    //use UIImageRenderingModeAlwaysOriginal to set the custom image for ios 7 and above.
    tabBarItem1.selectedImage = [[UIImage imageNamed:@"SelectedImage"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    tabBarItem1.image = [[UIImage imageNamed:@"UnselectedImage"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
}
else
{
    [tabBarItem1 setFinishedSelectedImage:[UIImage imageNamed:@"SelectedImage"] withFinishedUnselectedImage:[UIImage imageNamed:@"UnselectedImage"]];
}

希望这个能正常工作。
即使在iOS7中setFinishedSelectedImage:withFinishedUnselectedImage:已被弃用,但它在iOS7中仍然可以正常工作,但在iOS8中则不行。

你能否在viewWillAppear中设置tabbar来检查一下,因为我曾经遇到过同样的问题。 - Pushparaj
你是在使用没有选项卡的登录画面,然后segue到另一个画面吗?如果是这种情况,那么你应该设置选项卡在第一个显示选项卡的画面的viewWillAppear中。 - Pushparaj
请查看我的故事板截图以了解UI的结构。 - hoya21
你可以在UITabBarController之后的第一个控制器(在viewWillAppear中)添加代码(set tabbar items)来检查。 - Pushparaj
@hoya21 你是把这段代码添加到所有三个控制器(tabbarcontroller后的第一个控制器)中,才能使其正常工作吗? - Pushparaj
显示剩余2条评论

1
您也可以通过Storyboard设置这些图像: http://imgur.com/lmyi1Nw 如果您想以动态的方式实现,我建议从UITabBarController继承并重写其viewWillAppear:方法。

我也尝试从Storyboard中解决它。我还尝试从TabBarController中修复它,但是没有意义。 - hoya21
你说得对,那没有任何意义 ;)顺便说一下:从第一个vc调用[self.tabBarController.viewControllers objectAtIndex:0]等同于self。 - Eike

0

是的,这不能使用故事板完成 - 需要编写代码。

您必须在viewdidload操作中编写代码

UITabBar *tabBar = self.tabBar;

UITabBarItem *targetTabBarItem = [[tabbar items] objectAtIndex:0]; // whichever tab-item
UIImage *selectedIcon = [UIImage imageNamed:@"name-of-selected-image.png"];
[targetTabBarItem setSelectedImage:selectedIcon];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接