关于IOS6 IOS7中uitabbar的完全透明问题

最近在写自定义UITabBarController以达到更换皮肤的效果。类似iphone QQ更换主题。

分析了一下,QQ下面的tabbar,个人感觉是自定的按钮,但是他又有tabbar该有原生特性,除了一点,就是当你点QQ下面的tabbar

的时候,时间上只有touchupinside 才会产生点击事件。所以,猜测是自定按钮

说多了,现在说下,tabbar完全透明的问题

UIImage *bgImg = [[UIImage alloc] init];
    [self.tabBar setBackgroundImage:bgImg];
    [self.tabBar setShadowImage:bgImg];
    
    if ([[[UIDevice currentDevice] systemVersion] compare:@"7.0"] == NSOrderedAscending) {
        [[UITabBar appearance] setSelectedImageTintColor:[UIColor colorWithRed:127.0/255.0 green:186.0/255.0 blue:235.0/255.0 alpha:1.0]];
        [[UITabBar appearance] setSelectionIndicatorImage:bgImg];
        //上面两个是清除item的背景色跟选中背景色
        
    }

按上面的写完后,在IOS7上面已经完全透明了。而在IOS6上面发现背景是黑色的。

搜了很多,stackoverflow.com上的这个作用最大

The problem here is not that you cant set the image, or that you cant get rid of the black color, the problem is in UITabBarController the viewcontrollers you add does not reach behind the UITabBar

So the problem that occurred that there is a black view bellow the UITabBar, so even if you remove the tabBar what you will see is a black view (try to set tabBar.hidden = YES;)

A workaround is to set the superView of tabBar to a color

tabBar.superview.backgroundColor = [UIColor whiteColor];

This would fix your problem

,根据上面所说,设置tabbar.superview的背景色确实可以把黑色给变为白色,但是设为clear后,发现还是黑色。

于是想到了另一个东西:UIWindow

因为IOS7默认是全延伸,也就是说controller是延伸到tabbar下面,并且在window上面。如果在viewdidload里面关闭延伸

[self setEdgesForExtendedLayout:UIRectEdgeNone];

注意:上面这个只有IOS7开始才有的东西。

关闭后,发现IOS7上tabbar那部分也变为了黑色。也就是说你更改下self.window的颜色 那个黑色也会变了。

所以,貌似延伸tabbarcontroller的每个controller,就像IOS7那样。是更优的方法了。但是延伸后,frame就要注意了。底部多了一个49

既然知道了原理,方法就好想了。











你可能感兴趣的:(IOS)