求解,swift 自定义uiview的tabbar,继承uitabbar和继承uiview有什么区别

1881人阅读
[摘要]很多时候我们需要自定义UITabBarController或者UITabBar,但是往往用起来有些地方让人困惑。本文介绍iOS 自定义UITabBarController以及UITabBar。
最近在研究一些iOS中的基本问题,发现网上的答案很多,但是讲的都不够清晰,自己结合使用的实际情况总结下。
很多时候我们需要自定义UITabBarController或者UITabBar,但是往往用起来有些地方让人困惑。
1、先说下网络上常见的方式:隐藏原有的TabBar,使用UIView完全重新定义TabBar,这样的好处就是,定制化的程度很高,而且很多东西可以完全推倒重来,但是有一个很严重的问题,当使用&viewController.hidesBottomBarWhenPushed = YES 的时候,还是无法隐藏UITabBar,这个始终无法隐藏,除非采用自定制的动画移开这个UIView或者设置这个为Hidden,,最重要的问题也在这里,所以采用隐藏原有的TabBar的方式之后很多人抱怨无法通过 viewController.hidesBottomBarWhenPushed
= YES&来隐藏TabBar,网上有很多类似的代码,我这里就不贴源代码了,问题已经分析出来了。网易新闻的iOS客户端就是这样的方式实现的,有一点点小的瑕疵。
还有一种类型的TabBar可以使用这样的方式来实现,上截图:
这个就完全是重写了TabBar,而且和以前的系统原生的没有任何关系了,但是用的不多。
2、使用自定义UITabBarController, 继承UITabBarController,采用两种方式(为了适应iOS4 和 iOS5)
主要代码如下:
UIImageView
*imageView
[[UIImageView
initWithImage:[UIImage
imageNamed:@&tabbar_background&]];
imageView.frame
CGRectMake(0,
0, self.tabBar.frame.size.width, self.tabBar.frame.size.height);
NSLog(@&the
frame is %f---%f&, self.tabBar.frame.size.width, self.tabBar.frame.size.height);
imageView.contentMode
UIViewContentModeScaleToFill;
insertSubview:imageView
atIndex:0];
[imageView
方法一只能适用于iOS5以下的系统,在iOS5+上面无法使用,所以必须把这两种方法结合起来,当使用viewController.hidesBottomBarWhenPushed = YES,然后再加上
[self.navigationControllerpushViewController:ucenter
animated:YES];
就可以实现UITabBar的隐藏,同时也实现了自定义的UITabBarController,截图如下,新浪微博的客户端就是采用这样的方式实现的。
push之后的图片:
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:389496次
积分:4843
积分:4843
排名:第3427名
原创:67篇
转载:278篇
评论:26条
(1)(2)(1)(2)(5)(10)(12)(2)(3)(6)(1)(1)(30)(4)(2)(13)(10)(6)(3)(11)(3)(18)(3)(12)(5)(4)(16)(14)(26)(8)(6)(22)(14)(10)(45)(3)(7)(1)(1)(3)特酷吧[]采用&署名-非商业用途-保持一致&的创作共用协议,使用本文内容请遵循该协议 最近特酷吧所在的项目组对项目进行了一些基础组件的优化,其中有关于UITabBarController隐藏tabBar的问题感觉有必要总结下。一,需求分析先来说说项目基本需求:整个项目由左侧栏和主视图组成,主视图主体是一个UITabBarController,下属几个嵌套了UINavigationController的UIViewController。要求:当在页面上下滑动的时候,根据用户手势需要隐藏显示底部栏,也就是默认的UITabBarController的tabBar。特酷吧在设计的时候是将左侧栏和主视图通过addChildViewController的方式添加到一个容器UIViewController中,并使用了UITabBarController自带的tabBar。隐藏显示tabBar是通过修改tabBar的frame来实现的。界面布局演示代码如下:
self.window&=&[[[UIWindow&alloc]&initWithFrame:[[UIScreen&mainScreen]&applicationFrame]]&autorelease];&&
UIViewController&*parentController&=&[[UIViewController&alloc]&init];&&
SideBarViewController&&*sideBarViewController&=&[[SideBarViewController&alloc]&init];&&
UINavigationController&*sideBarNavController&=&[[UINavigationController&alloc]&initWithRootViewController:&sideBarViewController];&&
sideBarNavController.navigationBarHidden&=&YES;&&
[parentController&addChildViewController:sideBarNavController];&&
[parentController.view&addSubview:sideBarNavController.view];&&
MyUITabBarController&*tabBarController&=&[[MyUITabBarController&alloc]&init];&&
[parentController.view&addSubview:&tabBarController.view];&&
self.window.rootViewController&=&parentC&&其中MyUITabBarController中的演示代码如下:
UIViewController&*controller1&=&[[UIViewController&alloc]&init];&&
&&UINavigationController&*navigationController1&=&[[UINavigationController&alloc]initWithRootViewController:&controller1];&&
&&UIViewController&*controller2&=&[[UIViewController&alloc]&init];&&
&&UINavigationController&*navigationController2&=&[[UINavigationController&alloc]initWithRootViewController:&controller2];&&
&&navigationController1.navigationBarHidden&=&YES;&&
&&navigationController2.navigationBarHidden&=&YES;&&
&&NSArray&*controllers&=&[NSArray&arrayWithObjects:&navigationController1,&navigationController2,nil];&&
&&self.viewControllers&=&&&
&&self.selectedIndex&=&0;&&在测试中发现:在iOS SDK6的环境下移动tabBar后,界面会留出空白,也就是说UITabBarController的tabBar的部分实际上是独占了该区域,即使强制将tabBar通过设置frame将tabBar移开,在该区域也不会显示其他内容。关于这个问题,github上有一个解决方案:该方案代码很简洁:就是在移动tabBar之后,修改视图的frame大小,问题看似解决了。二,我为什么没有使用UITabBarController_setHidden似乎UITabBarController_setHidden能够解决问题,但在实际使用的时候发现一个问题,当使用pushViewController弹出一个UIViewController【配置hidesBottomBarWhenPushed=YES,页面弹出时tabBar隐藏】,接着popViewControllerAnimated弹回时,tabBar会自动显示并将所属页面的frame重新设置了。这样,设置页面frame的时机不好控制,另外这种方式在页面切换的时候也会有些不太美观的效果。使用系统自带的tabBar或者navigationBar的好处是显而易见的,不过在本例中的情形(需要手势去隐藏显示底部栏),使用自定的tabBar反而不好处理。尝试失败之后,我决定使用自定义的tabBar,想要自定义tabBar,一个问题就是怎么隐藏自带的tabBar。三,如何隐藏UITabBarController自带的tabBar网络上有方法:self.tabBar.hidden = YES;甚至是[self.tabBar removeFromSuperview];这些确实能实现隐藏tabBar的功能,但是隐藏了之后在tabBar原有的位置没有填充上内容。正确的做法是:将UITabBarController中的各个RootViewController进行如下设置:self.homeViewController.hidesBottomBarWhenPushed = YES;在特酷吧的工程中,还遇到了一个问题:即使设置了hidesBottomBarWhenPushed,在界面的底部还是留有一块没有内容的区域(正好是tabBar的区域)。经过查询,发现原因是在添加主体UITabBarController到容器UIViewController的时候,使用了addChildViewController的方式,将addChildViewController去掉,只保留addSubview的方式,一切运行正常。四,addChildViewController怎么能影响到UITabBarController的tabBar这个问题我暂时不清楚是由什么造成的。但说到这里了就谈谈特酷吧对这种方式的看法:使用addChildViewController的方式来处理本文描述的场景并没有什么好处。addChildViewController这种方式我感觉主要是为了能方便页面切换(使用transitionFromViewController方法),而本场景中,并不是&两个页面切换&,而是左侧栏和主体视图一直都存在,只是通过手势移开或者显示各自的view而已。之前我都是只使用addSubview将左侧栏的view和主体view(都是UIController的view)依次添加到一个容器上,网络上有人说&[viewController.view addSubview:someOtherViewController.view];&这种方式其实对是UIViewController的误用,因为这么做&将不会触发被加入view hierarchy的view的controller的viewWillAppear:方法&。。 转载请注明来自,本文地址:推荐阅读:
欢迎关注我的微信公众号:多识阅读,在这里有我的职业感想,互联网产品心得以及创意分享。
博主推荐文章经验之谈―自定义tabbar(继承于UITabBar)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
经验之谈―自定义tabbar(继承于UITabBar)
上传于||暂无简介
阅读已结束,如果下载本文需要使用5下载券
想免费下载本文?
你可能喜欢storyboard自定义tabbar | 寒星晓月
storyboard自定义tabbar
von hxxy2003最近开发的app,使用上storyboard,但是tabbar需要自定义,可以使用重写tabbar+storyboard设置的方法去自定义你的tabbar,非常方便。首先写一个CustomTabBarViewController,继承UITabBarController,在CustomTabBarViewController的viewDidLoad写入:[[UITabBar appearance] setTintColor:[UIColor blackColor]];
上面的代码实现的是tabbar的item的文字点击后变成黑色,默认是蓝色。UITabBarItem *item1 = [tabBar.items objectAtIndex:0];UITabBarItem *item2 = [tabBar.items objectAtIndex:1];[item1 setTitle:@”地图“];[item2 setTitle:@”活动“];上面实现的是item1在第一个位置,item2在第二个位置,并设置两个item的title,接下来要实现的就是这些item图标的改变,一个是默认的图标,另外就是点击时图标的改变。[item1 setFinishedSelectedImage:[UIImage imageNamed:@”tab地图点击.png”]withFinishedUnselectedImage:[UIImage imageNamed:@”tab地图.png”]];
[item2 setFinishedSelectedImage:[UIImage imageNamed:@”tab活动点击.png”]withFinishedUnselectedImage:[UIImage imageNamed:@”tab活动.png”]];上面实现的,其中setFinishedSelectedImage就是实现点击时的图片,withFinishedUnselectedImage实现的是默认图片。然后再结合storyboard的设置,改变tabbar的背景图片,和点击时图片的变化 ,如下:
相关文章二2015十二2014十二2014
我的微信文章友情链接

我要回帖

更多关于 swift 自定义uiview 的文章

 

随机推荐