如何禁用ios 自定义tabbarr中more的编辑功能

已有 126 人收藏
&&&&点击 TabBar 上的“更多”按钮时,会出现另外一条TabBar,显示更多隐藏的按钮。可用于TabBar上按钮过多的情况。
&&&&作者说:该代码时根据Levey TabBarController 改写实现设计的需求,效果看着比较不错,switchTabBar,可能存在部分bug,不过尚未发现,欢迎拍砖。
&&&&小编注:感谢开发者@D 发布代码于。
&&&&小编再注:原代码由于不方便录制好的效果视频,小编做了一下修改。所以效果图和原代码效果在颜色上有不同。
测试环境:
&&&&[Code4App]编译测试,测试环境:Xcode 5.0, iOS 6.0 以上。
相关代码:
& (13368次查看,3347次下载)
& (9612次查看,1734次下载)
& (11266次查看,2267次下载)
& (20094次查看,4215次下载)
& (14809次查看,2550次下载)
代码评论:
登录后方可评论
新手求教个问题,您这个Demo上面的状态条白底黑字是故意留出来的吗,如果不想要这个效果,只想用系统默认的状态条 怎么改,望高手不吝赐教~谢谢
登录后方可评论
@D : 谢谢~已解决这个问题,再请教个问题,push到下一页面TabBar该如何隐藏呀???万分感激
登录后方可评论
@weiren无悔 : 这个是图片,你如果想要ios7默认的那种效果,最简单的办法,就是搞成图片,每一个都搞一个默认的效果,选中的效果,第二种,就是改代码了,我这个组件好像默认不支持,你可以参考下实现方式,改下
登录后方可评论
每个视图的标签栏控制器的标题怎么显示不了啊?
登录后方可评论
@时咣吥咾、硪們吥潵 : 你可以把viewController自己改下看看,自己写几个试试,主要是tabbar的功能
登录后方可评论
这个下下来以后不能运行,说不能用ios这个设备运行,请高手指点下是哪里设置的问题啊?
登录后方可评论
@谁抢名字啊 : 默认是你Xcode支持的版本,我的是Xcode5,所以默认IOS7,你将Deployment Target 根据你Xcode支持的模拟器版本,设置低一点就可以了,我在ios5上跑过,应该可以支持所有的ios版本
登录后方可评论
-控件分类-
-功能分类-
耗时 0.1437 秒8696人阅读
  UITabBarController是IOS中很常用的一个viewController,例如系统的闹钟程序,ipod程序等。UITabBarController通常作为整个程序的rootViewController,而且不能添加到别的container viewController中。
  首先我们看一下它的view层级图:
一、手动创建UITabBarController
  最常见的创建UITabBarController的地方就是在application delegate中的&方法,因为UITabBarController通常是作为整个程序的rootViewController的,我们需要在程序的window显示之前就创建好它,具体步骤如下:
  1、创建一个UITabBarController对象
  2、创建tabbarcontroller中每一个tab对应的要显示的对象
  3、通过UITabBarController的viewController属性将要显示的所有content viewcontroller添加到UITabBarController中
  4、通过设置UITabBarController对象为window.rootViewController,然后显示window
  下面看一个简单的例子:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
   SvTabBarFirstViewController *viewController1, *viewController2;
viewController1 = [[SvTabBarFirstViewController alloc] initWithNibName:nil bundle:nil];
viewController1.title = @&First&;
viewController2 = [[SvTabBarFirstViewController alloc] initWithNibName:nil bundle:nil];
viewController2.title = @&Second&;
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
self.tabBarController.delegate =
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
[viewController1 release];
[viewController2 release];
self.window.rootViewController = self.tabBarC
[self.window makeKeyAndVisible];
return YES;
二、UITabBarItem
  UITabBar上面显示的每一个Tab都对应着一个ViewController,我们可以通过设置viewcontroller.tabBarItem属性来改变tabbar上对应的tab显示内容。否则系统将会根据viewController的title自动创建一个,该tabBarItem只显示文字,没有图像。当我们自己创建UITabBarItem的时候,我们可以显示的指定显示的图像和对应的文字描述。当然还可以通过setFinishedSelectedImage:withFinishedUnselectedImage:方法给选中状态和飞选中状态指定不同的图片。下面看个自己创建UITabBarItem的小例子:
UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:@&Second& image:nil tag:2];
[item setFinishedSelectedImage:[UIImage imageNamed:@&second.png&]
withFinishedUnselectedImage:[UIImage imageNamed:@&first.png&]];
viewController2.tabBarItem =
[item release];
  此外UITabBarItem还有一个属性badgeValue,通过设置该属性可以在其右上角显示一个小的角标,通常用于提示用户有新的消息,使用很简单,后面有例子。
三、moreNavigationController
  UITabBar上最多可以显示5个Tab,当我们往UITabBarController中添加超过的viewController超过5个时候,最后一个一个就会自动变成,按照设置的viewControlles的顺序,显示前四个viewController的tabBarItem,后面的tabBarItem将不再显示。当点击more时候将会弹出一个标准的navigationViewController,里面放有其它未显示的的viewController,并且带有一个edit按钮,通过点击该按钮可以进入类似与ipod程序中设置tabBar的编辑界面。编辑界面中默认所有的viewController都是可以编辑的,我们可以通过设置UITabBarController的customizableViewControllers属性来指定viewControllers的一个子集,即只允许一部分viewController是可以放到tabBar中显示的。但是这块儿要注意一个问题就是每当UITabBarController的viewControllers属性发生变化的时候,customizableViewControllers就会自动设置成跟viewControllers一致,即默认的所有的viewController都是可以编辑的,如果我们要始终限制只是某一部分可编辑的话,记得在每次viewControlles发生改变的时候,重新设置一次customizableViewControllers。
四、UITabBarController的Rotation
  UITabBarController默认只支持竖屏,当设备方向放生变化时候,它会查询viewControllers中包含的所有ViewController,仅当所有的viewController都支持该方向时,UITabBarController才会发生旋转,否则默认的竖向。
  此处需要注意当UITabBarController支持旋转,而且发生旋转的时候,只有当前显示的viewController会接收到旋转的消息。
五、UITabBar
&  UITabBar自己有一些方法是可以改变自身状态,但是对于UITabBarController自带的tabBar,我们不能直接去修改其状态。任何直接修改tabBar的操作将会抛出异常,下面看一个抛出异常的小例子:
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
self.tabBarController.delegate =
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, viewController3, nil];
self.window.rootViewController = self.tabBarC
[self.window makeKeyAndVisible];
self.tabBarController.tabBar.selectedItem =
  上面代码的最后一行直接修改了tabBar的状态,运行程序回得到如下结果:
六、Change Selected Viewcontroller
  改变UITabBarController中当前显示的viewController,可以通过一下两种方法:
  1、selectedIndex属性
  通过该属性可以获得当前选中的viewController,设置该属性,可以显示viewControllers中对应的index的viewController。如果当前选中的是MoreViewController的话,该属性获取出来的值是NSNotFound,而且通过该属性也不能设置选中MoreViewController。设置index超出viewControllers的范围,将会被忽略。
  2、selectedViewController属性
  通过该属性可以获取到当前显示的viewController,通过设置该属性可以设置当前选中的viewController,同时更新selectedIndex。可以通过给该属性赋值
tabBarController.moreNavigationController可以选中moreViewController。
  3、viewControllers属性
  设置viewControllers属性也会影响当前选中的viewController,设置该属性时UITabBarController首先会清空所有旧的viewController,然后部署新的viewController,接着尝试重新选中上一次显示的viewController,如果该viewController已经不存在的话,会接着尝试选中index和selectedIndex相同的viewController,如果该index无效的话,则默认选中第一个viewController。
七、UITabBarControllerDelegate
  通过代理我们可以监测UITabBarController的当前选中viewController的变化,以及moreViewController中对编辑所有viewController的编辑。通过实现下面方法:
  该方法用于控制TabBarItem能不能选中,返回NO,将禁止用户点击某一个TabBarItem被选中。但是程序内部还是可以通过直接setSelectedIndex选中该TabBarItem。
  下面这三个方法主要用于监测对moreViewController中对view controller的edit操作
- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewC
- (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)
- (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)
本文转载自:/smileEvday/archive//2495153.html#2374395
欢迎加入ios开发讨论群:,参与交流讨论。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:830017次
积分:9340
积分:9340
排名:第865名
原创:122篇
转载:115篇
译文:10篇
评论:92条
(7)(2)(3)(2)(3)(2)(15)(2)(3)(1)(2)(7)(4)(2)(1)(1)(5)(6)(4)(9)(10)(11)(13)(4)(3)(15)(9)(8)(58)(18)(14)(1)(1)UITabBarController用法 - CSDN博客
注意:UITabBarController通常作为整个程序的rootViewController,而且不能添加到别的container viewController中
最常见的创建UITabBarController的地方就是在application delegate中的&方法,因为UITabBarController通常是作为整个程序的rootViewController的,我们需要在程序的window显示之前就创建好它,具体步骤如下:
  1、创建一个UITabBarController对象
  2、创建tabbarcontroller中每一个tab对应的要显示的对象
  3、通过UITabBarController的viewController属性将要显示的所有content viewcontroller添加到UITabBarController中
  4、通过设置UITabBarController对象为window.rootViewController,然后显示window
& 一下是主要实现的代码,一下代码就可以基本实现页面的跳转。 & &&
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
//定义两个页面控制器,也可以是定义不同的页面控制器
   SvTabBarFirstViewController *viewController1, *viewController2;
viewController1 = [[SvTabBarFirstViewController alloc] initWithNibName:nil bundle:nil];
viewController1.title = @&First&;
//实例话页面控制器并附上Title
viewController2 = [[SvTabBarFirstViewController alloc] initWithNibName:nil bundle:nil];
viewController2.title = @&Second&;
//实例话一个UITaBarController
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
self.tabBarController.delegate =
//添加uitabBarConterller的所有页面控制器, 有几个页面就要添加几个, 就会显示出分区。 不过不能超过5个,超过的会显示不出来;(下面详解)
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
[viewController1 release];
[viewController2 release];
self.window.rootViewController = self.tabBarC
[self.window makeKeyAndVisible];
return YES;
二、UITabBarItem  UITabBar上面显示的每一个Tab都对应着一个ViewController,我们可以通过设置viewcontroller.tabBarItem属性来改变tabbar上对应的tab显示内容。否则系统将会根据viewController的title自动创建一个,该tabBarItem只显示文字,没有图像。当我们自己创建UITabBarItem的时候,我们可以显示的指定显示的图像和对应的文字描述。当然还可以通过setFinishedSelectedImage:withFinishedUnselectedImage:方法给选中状态和飞选中状态指定不同的图片。下面看个自己创建UITabBarItem的小例子://更具页面控制器的title 对item进行编辑UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:@&Second& image:nil tag:2];
[item setFinishedSelectedImage:[UIImage imageNamed:@&second.png&]
withFinishedUnselectedImage:[UIImage imageNamed:@&first.png&]];
viewController2.tabBarItem =
[item release];  此外UITabBarItem还有一个属性badgeValue,通过设置该属性可以在其右上角显示一个小的角标,通常用于提示用户有新的消息,使用很简单,后面有例子。&三、moreNavigationController  UITabBar上最多可以显示5个Tab,当我们往UITabBarController中添加超过的viewController超过5个时候,最后一个一个就会自动变成,按照设置的viewControlles的顺序,显示前四个viewController的tabBarItem,后面的tabBarItem将不再显示。当点击more时候将会弹出一个标准的navigationViewController,里面放有其它未显示的的viewController,并且带有一个edit按钮,通过点击该按钮可以进入类似与ipod程序中设置tabBar的编辑界面。编辑界面中默认所有的viewController都是可以编辑的,我们可以通过设置UITabBarController的customizableViewControllers属性来指定viewControllers的一个子集,即只允许一部分viewController是可以放到tabBar中显示的。但是这块儿要注意一个问题就是每当UITabBarController的viewControllers属性发生变化的时候,customizableViewControllers就会自动设置成跟viewControllers一致,即默认的所有的viewController都是可以编辑的,如果我们要始终限制只是某一部分可编辑的话,记得在每次viewControlles发生改变的时候,重新设置一次customizableViewControllers。  四、UITabBarController的Rotation  UITabBarController默认只支持竖屏,当设备方向放生变化时候,它会查询viewControllers中包含的所有ViewController,仅当所有的viewController都支持该方向时,UITabBarController才会发生旋转,否则默认的竖向。  此处需要注意当UITabBarController支持旋转,而且发生旋转的时候,只有当前显示的viewController会接收到旋转的消息。&五、UITabBar
先说下网络上常见的方式:隐藏原有的TabBar,使用UIView完全重新定义TabBar,这样的好处就是,定制化的程度很高,而且很多东西可以完全推倒重来,但是有一个很严重的问题,当使用&viewController.hidesBottomBarWhenPushed = YES 的时候,还是无法隐藏UITabBar,这个始终无法隐藏,除非采用自定制的动画移开这个UIView或者设置这个为Hidden,,最重要的问题也在这里,所以采用隐藏原有的TabBar的方式之后很多人抱怨无法通过 viewController.hidesBottomBarWhenPushed = YES&来隐藏TabBar,网上有很多类似的代码,我这里就不贴源代码了,问题已经分析出来了
使用自定义UITabBarController, 继承UITabBarController,
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@&tabbar_background&]];
imageView.frame = CGRectMake(0, 0, self.tabBar.frame.size.width, self.tabBar.frame.size.height);//contentMode 这个属性是用来设置图片的显示方式,如居中、居右,是否缩放等,UIViewContentModeScaleToFill属性会导致图片变形。UIViewContentModeScaleAspectFit会保证图片比例不变,而且全部显示在ImageView中,这意味着ImageView会有部分空白。UIViewContentModeScaleAspectFill也会证图片比例不变,但是是填充整个ImageView的,可能只有部分图片显示出来。
imageView.contentMode = UIViewContentModeScaleToFill; [[self tabBar] insertSubview:imageView atIndex:0]; [imageView release];方法一只能适用于iOS5以下的系统,在iOS5+上面无法使用,所以必须把这两种方法结合起来,当使用viewController.hidesBottomBarWhenPushed = YES,然后再加上[self.navigationControllerpushViewController:ucenter animated:YES];&  2.UITabBar自己有一些方法是可以改变自身状态,但是对于UITabBarController自带的tabBar,我们不能直接去修改其状态。任何直接修改tabBar的操作将会抛出异常,下面看一个抛出异常的小例子://这是在app里面做的小例子self.tabBarController = [[[UITabBarController alloc] init] autorelease];
self.tabBarController.delegate =
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, viewController3, nil];
self.window.rootViewController = self.tabBarC
[self.window makeKeyAndVisible];
self.tabBarController.tabBar.selectedItem =  上面代码的最后一行直接修改了tabBar的状态,运行程序回得到如下结果:&六、Change Selected Viewcontroller  改变UITabBarController中当前显示的viewController,可以通过一下两种方法:  1、selectedIndex属性  通过该属性可以获得当前选中的viewController,设置该属性,可以显示viewControllers中对应的index的viewController。如果当前选中的是MoreViewController的话,该属性获取出来的值是NSNotFound,而且通过该属性也不能设置选中MoreViewController。设置index超出viewControllers的范围,将会被忽略。  2、selectedViewController属性  通过该属性可以获取到当前显示的viewController,通过设置该属性可以设置当前选中的viewController,同时更新selectedIndex。可以通过给该属性赋值tabBarController.moreNavigationController可以选中moreViewController。  3、viewControllers属性  设置viewControllers属性也会影响当前选中的viewController,设置该属性时UITabBarController首先会清空所有旧的viewController,然后部署新的viewController,接着尝试重新选中上一次显示的viewController,如果该viewController已经不存在的话,会接着尝试选中index和selectedIndex相同的viewController,如果该index无效的话,则默认选中第一个viewController。UITabBarController使用详解
编辑:www.fx114.net
本篇文章主要介绍了"UITabBarController使用详解",主要涉及到UITabBarController使用详解方面的内容,对于UITabBarController使用详解感兴趣的同学可以参考一下。
UITabBarController是IOS中很常用的一个viewController,例如系统的闹钟程序,ipod程序等。UITabBarController通常作为整个程序的rootViewController,而且不能添加到别的container
viewController中。
  首先我们看一下它的view层级图:
一、手动创建UITabBarController
  最常见的创建UITabBarController的地方就是在application
delegate中的&方法,因为UITabBarController通常是作为整个程序的rootViewController的,我们需要在程序的window显示之前就创建好它,具体步骤如下:
1、创建一个UITabBarController对象
  2、创建tabbarcontroller中每一个tab对应的要显示的对象
  3、通过UITabBarController的viewController属性将要显示的所有content
viewcontroller添加到UITabBarController中
  4、通过设置UITabBarController对象为window.rootViewController,然后显示window
  下面看一个简单的例子:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
   SvTabBarFirstViewController *viewController1, *viewController2;
viewController1 = [[SvTabBarFirstViewController alloc] initWithNibName:nil bundle:nil];
viewController1.title = @"First";
viewController2 = [[SvTabBarFirstViewController alloc] initWithNibName:nil bundle:nil];
viewController2.title = @"Second";
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
self.tabBarController.delegate =
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
[viewController1 release];
[viewController2 release];
self.window.rootViewController = self.tabBarC
[self.window makeKeyAndVisible];
return YES;
二、UITabBarItem
  UITabBar上面显示的每一个Tab都对应着一个ViewController,我们可以通过设置viewcontroller.tabBarItem属性来改变tabbar上对应的tab显示内容。否则系统将会根据viewController的title自动创建一个,该tabBarItem只显示文字,没有图像。当我们自己创建UITabBarItem的时候,我们可以显示的指定显示的图像和对应的文字描述。当然还可以通过setFinishedSelectedImage:withFinishedUnselectedImage:方法给选中状态和飞选中状态指定不同的图片。下面看个自己创建UITabBarItem的小例子:
UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:@"Second" image:nil tag:2];
[item setFinishedSelectedImage:[UIImage imageNamed:@"second.png"]
withFinishedUnselectedImage:[UIImage imageNamed:@"first.png"]];
viewController2.tabBarItem =
[item release];
  此外UITabBarItem还有一个属性badgeValue,通过设置该属性可以在其右上角显示一个小的角标,通常用于提示用户有新的消息,使用很简单,后面有例子。
三、moreNavigationController
  UITabBar上最多可以显示5个Tab,当我们往UITabBarController中添加超过的viewController超过5个时候,最后一个一个就会自动变成,按照设置的viewControlles的顺序,显示前四个viewController的tabBarItem,后面的tabBarItem将不再显示。当点击more时候将会弹出一个标准的navigationViewController,里面放有其它未显示的的viewController,并且带有一个edit按钮,通过点击该按钮可以进入类似与ipod程序中设置tabBar的编辑界面。编辑界面中默认所有的viewController都是可以编辑的,我们可以通过设置UITabBarController的customizableViewControllers属性来指定viewControllers的一个子集,即只允许一部分viewController是可以放到tabBar中显示的。但是这块儿要注意一个问题就是每当UITabBarController的viewControllers属性发生变化的时候,customizableViewControllers就会自动设置成跟viewControllers一致,即默认的所有的viewController都是可以编辑的,如果我们要始终限制只是某一部分可编辑的话,记得在每次viewControlles发生改变的时候,重新设置一次customizableViewControllers。
四、UITabBarController的Rotation
  UITabBarController默认只支持竖屏,当设备方向放生变化时候,它会查询viewControllers中包含的所有ViewController,仅当所有的viewController都支持该方向时,UITabBarController才会发生旋转,否则默认的竖向。
  此处需要注意当UITabBarController支持旋转,而且发生旋转的时候,只有当前显示的viewController会接收到旋转的消息。
五、UITabBar
&  UITabBar自己有一些方法是可以改变自身状态,但是对于UITabBarController自带的tabBar,我们不能直接去修改其状态。任何直接修改tabBar的操作将会抛出异常,下面看一个抛出异常的小例子:
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
self.tabBarController.delegate =
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, viewController3, nil];
self.window.rootViewController = self.tabBarC
[self.window makeKeyAndVisible];
self.tabBarController.tabBar.selectedItem =
  上面代码的最后一行直接修改了tabBar的状态,运行程序回得到如下结果:
六、Change Selected
Viewcontroller
  改变UITabBarController中当前显示的viewController,可以通过一下两种方法:
  1、selectedIndex属性
  通过该属性可以获得当前选中的viewController,设置该属性,可以显示viewControllers中对应的index的viewController。如果当前选中的是MoreViewController的话,该属性获取出来的值是NSNotFound,而且通过该属性也不能设置选中MoreViewController。设置index超出viewControllers的范围,将会被忽略。
  2、selectedViewController属性
  通过该属性可以获取到当前显示的viewController,通过设置该属性可以设置当前选中的viewController,同时更新selectedIndex。可以通过给该属性赋值
tabBarController.moreNavigationController可以选中moreViewController。
  3、viewControllers属性
  设置viewControllers属性也会影响当前选中的viewController,设置该属性时UITabBarController首先会清空所有旧的viewController,然后部署新的viewController,接着尝试重新选中上一次显示的viewController,如果该viewController已经不存在的话,会接着尝试选中index和selectedIndex相同的viewController,如果该index无效的话,则默认选中第一个viewController。
七、UITabBarControllerDelegate
  通过代理我们可以监测UITabBarController的当前选中viewController的变化,以及moreViewController中对编辑所有viewController的编辑。通过实现下面方法:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController;
  该方法用于控制TabBarItem能不能选中,返回NO,将禁止用户点击某一个TabBarItem被选中。但是程序内部还是可以通过直接setSelectedIndex选中该TabBarItem。
  下面这三个方法主要用于监测对moreViewController中对view controller的edit操作
- (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)
- (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)
本文标题:
本页链接:

我要回帖

更多关于 tabbar 的文章

 

随机推荐