在tabBarController模式下怎么对uiviewcontroller透明刷新

UITabBarController用法详解 - iOS - UI基础知识总结15
UITabBarController用法详解 - iOS - UI基础知识总结15
[摘要:UITabBarController是IOS中很经常使用的一个viewController,比方体系的闹钟顺序,ipod顺序等。UITabBarController平常做为全部顺序的rootViewController,并且不克不及增加到其余container viewController中(正在背面会]
UITabBarController是IOS中很常用的一个viewController,例如系统的闹钟程序,ipod程序等。UITabBarController通常作为整个程序的rootViewController,而且不能添加到别的container viewController中(在后面会详细解释)
先通过UITabBarController的层级图来分析一下它的结构组成
它是由下方的TabBar和用来显示内容的Custom content组成,整个界面又可以认为是TabBarController的显示视图
下面先说一下标签控制器和导航控制器在使用上的区别:
1、导航视图控制器,管理的控制器之间存在层级关系(依赖关系)
&&&& 标签视图控制器,管理的控制器之间是并列关系(同时存在,互不干扰)
&&&& 2、管理方式
&&&& 导航控制器以栈的形式管理多个试图控制器,push入栈,pop出栈,当返回上一界面时,空间回收
&&&& 标签视图控制器,以不可变数组管理,而且创建时必须要全部指定所管理的多个视图控制器,而且多个视图控制器同时存在,空间不回收
&&&& 3、视图控制器之间的嵌套
&&&& 正常用法:标签视图控制器管理多个导航控制器,每个导航控制器又管理多个单视图控制器(每个界面都有导航条,导航条都是不同的,单视图控制器可以自定义导航内容)
&&&& 非常用法:导航控制器管理标签控制器,标签控制器用来管理多个单视图控制器(每个界面都有导航条,但是导航条都是一样的,单视图控制器不可以自定义导航条内容),这种用法不符合逻辑,很少使用
&&&& 导航控制器、标签控制器都是多视图控制器,可以管理多个视图控制器,但是UITableViewController、UIViewController是单视图控制器,不可以管理视图控制器,只能管理视图
接下来再熟悉一下视图下面的UITabBar的结构组成
注意:UITabBarButton在UITabBar中得位置是均分的,UITabBar的高度为49
注意:UITabBarButton的一些属性是通过tabBarItem来改变的(后面的代码会详细介绍用法)
下面主要说一下UITabBar的注意事项:
1、UITabBar上最多可以显示5个TabBarButton,当我们往UITabBarController中添加的viewController超过5个的时候,最后一个一个就会自动变成more图标,按照设置的viewControlles的顺序,显示前四个viewController的tabBarItem,后面的tabBarItem将不再显示。当点击more的时候将会弹出一个标准的navigationViewController,里面放有其它未显示的的viewController,并且带有一个edit按钮,通过点击该按钮可以进入类似与ipod程序中设置tabBar的编辑界面。编辑界面中默认所有的viewController都是可以编辑的,我们可以通过设置UITabBarController的customizableViewControllers属性来指定viewControllers的一个子集,即只允许一部分viewController是可以放到tabBar中显示的。但是这块儿要注意一个问题就是每当UITabBarController的viewControllers属性发生变化的时候,customizableViewControllers就会自动设置成和viewControllers一致,即默认的所有的viewController都是可以编辑的,如果我们要始终限制只是某一部分可编辑的话,记得在每次viewControlles发生改变的时候,重新设置一次customizableViewControllers。
2、UITabBarController默认只支持竖屏,当设备方向放生变化时候,它会查询viewControllers中包含的所有ViewController,仅当所有的viewController都支持该方向时,UITabBarController才会发生旋转,否则默认的竖向
此处需要注意当UITabBarController支持旋转,而且发生旋转的时候,只有当前显示的viewController会接收到旋转的消息
3、如果UITabBarController有N个子控制器,那么UITabBar内部就会有N 个UITabBarButton作为子控件与之对应,点击对应的UITabBarButton就会显示对应的视图
&&&& UITabBar自己有一些方法是可以改变自身状态,但是对于UITabBarController自带的tabBar,我们不能直接去修改其状态。任何直接修改tabBar的操作将会抛出异常
接下来用代码表述UITabBarController的用法:
// 1、创建3个单视图控制器,分别加到对应的导航控制器上
FirstViewController *firstVC = [[[FirstViewController alloc]init]autorelease];
UINavigationController *firstNav = [[[UINavigationController alloc]initWithRootViewController:firstVC]autorelease];
firstVC.view.backgroundColor = [UIColor redColor];
SecondViewController *secondVC = [[[SecondViewController alloc]init]autorelease];
UINavigationController *secondNav = [[[UINavigationController alloc]initWithRootViewController:secondVC]autorelease];
secondVC.view.backgroundColor = [UIColor orangeColor];
ThirdViewController *thirdVC = [[[ThirdViewController alloc]init]autorelease];
UINavigationController *thirdNav = [[[UINavigationController alloc]initWithRootViewController:thirdVC]autorelease];
thirdVC.view.backgroundColor = [UIColor cyanColor];
// 2、创建一个不可变数组,装入3个导航控制器
NSArray *controllers = @[firstNav, secondNav, thirdNav];
// 3、创建一个标签视图控制器
UITabBarController *tabBarController = [[[UITabBarController alloc]init]autorelease];
// 4、设置标签控制器的被控制对象(3个导航控制器)
tabBarController.viewControllers =
// 5、将标签控制器设置为window的根视图
self.window.rootViewController = tabBarC
// 设置标签视图控制器的一些属性:
// 设置三个导航控制器在tabBarController上的按钮的标题和背景图片
firstNav.tabBarItem.title = @&First&;
firstNav.tabBarItem.image = [UIImage imageNamed:@&qr_toolbar_light_up_hl&];
secondNav.tabBarItem.title = @&Second&;
secondNav.tabBarItem.image = [UIImage imageNamed:@&tabbar_contacts&];
thirdNav.tabBarItem.title = @&Third&;
thirdNav.tabBarItem.image = [UIImage imageNamed:@&tabbar_discover&];
// 设置标签栏的渲染颜色(图标点击后的颜色)
tabBarController.tabBar.tintColor = [UIColor purpleColor];
// 设置整个tabBar的颜色(如果不设置,tabBar默认是毛玻璃效果) //
tabBarController.tabBar.barTintColor = [UIColor whiteColor];
// 设置某个tabBarItem的右上角的小角标内容(NSString)
firstNav.tabBarItem.badgeValue = @&新消息&;
// 有两种方式可以往UITabBarController中添加子控制器
UIViewController *con1 = [[UIViewController alloc]init];
con1.view.backgroundColor = [UIColor grayColor];
UINavigationController *nav1 = [[UINavigationController alloc]initWithRootViewController:con1];
[con1 release];
nav1.tabBarItem.title = @&第四个按钮&;
// 第一种添加方法(该方法如果放在方法tabBarController.viewControllers = controllers之后,设置无效,原因不详) //
[tabBarController addChildViewController:nav1];
// 第二种添加方法(该方法重新设置了viewControllers,会把前面的设置覆盖,所以也可以用这个方法删除某个按钮) //
tabBarController.viewControllers = @[firstNav, secondNav, thirdNav, nav1];
// 设置tabBar的样式(没多大用处)
tabBarController.tabBar.barStyle = UIBarStyleD
UIBarStyleDefault
UIBarStyleBlack // 黑色毛玻璃效果
UIBarStyleBlackOpaque
UIBarStyleBlackTranslucent
// 设置标签视图控制器默认选中的标签(系统默认选择第0个)
tabBarController.selectedIndex = 0;
// 设置标签视图控制器默认选中的视图控制器(效果和选择标签一样) //
tabBarController.selectedViewController = firstN
// 设置代理
tabBarController.delegate =
代理(委托)方法的实现(其中的修改TabBarButton的代理方法只有当TabBarButton的数量是5个或以上时才有意义)
#pragma mark - tabBarController Delegate // 将要选中某一个控制器 - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
// 设置不让选中某一个控制器(其实这里的设置无效:因为三个按钮是UINavigationController类型)
// 这里只是介绍这种设计思想,让大家知道有这么一个方法 //
if ([viewController isKindOfClass:[ThirdViewController class]]) { //
return NO; //
return YES;
// 用别的方法实现
UINavigationController *nav = (UINavigationController *)[[tabBarController viewControllers] objectAtIndex:2];
if ([viewController isEqual:nav]) {
return NO;// 第三个按钮不让选择
return YES; } // 已经选中某一个控制器 - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
// 如果选择了第二个控制器,弹出警告
if (tabBarController.selectedIndex == 1) {
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@&警告& message:@&18岁以下禁止进入& delegate:self cancelButtonTitle:@&确定& otherButtonTitles:nil, nil];
[alert show];
[alert release];
} } // 将要定制这些导航控制器(移动、删除操作等) - (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers {
// 查看定制前导航控制器数组的对象的排列顺序
NSLog(@&%@&, viewControllers); } // 导航控制器定制完成 - (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed {
// 查看定制后导航控制器数组的对象的排列顺序
NSLog(@&%@&, viewControllers); }
下面是运行的两个效果图
感谢关注 Ithao123精品文库频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。
IThao123周刊首先找到自定义TabBar按钮的点击方法
//按钮被选中的事件
-(void) buttonSelected:(UIButton *) button{
self.lastBut.selected=NO;
button.selected=YES;
self.lastBut=
NSInteger index=[self.subviews indexOfObject:button];
if (index&2) {
//通过代理刷新viewcontroller
if ([self.delegate respondsToSelector:@selector(tabBarRefreshController:currentIndex:)]) {
[self.delegate tabBarRefreshController:self currentIndex:index];
接下来找到代理方法
//HQTabBarView当中的代理方法用来刷新数据
-(void)tabBarRefreshController:(HQTabBarView *)tabBarView currentIndex:(NSInteger)currentIndex{
//当tableBar被选中之后,发送一个通知
//在我们的精华控制器内接收该通知
NSMutableDictionary *info=[NSMutableDictionary dictionary];
info[HQTabBarControllerSelectionIndexKey]=[NSNumber numberWithInteger:currentIndex];
[[NSNotificationCenter defaultCenter] postNotificationName:HQTabBarControllerSelectedNotification object:nil userInfo:info];
self.selectedIndex=currentI
在代理方法里发送了一个通知,然后去需要刷新的viewcontroller接收通知
-(void) tabBarClicked:(NSNotification *) notification{
NSDictionary *info=notification.userI
//当前被选中的index
NSInteger currentIndex=[info[HQTabBarControllerSelectionIndexKey] integerValue];
self.clickCount++;
//判断是不是精华控制器+是不是当前窗口+是不是连续点击
if (currentIndex==0&&[self.view isShowingInWindow]&&self.clickCount&1) {
[self.tableView.mj_header beginRefreshing];
//如果点击了其他的控制器,将点击次数清零
if (currentIndex!=0) {
self.clickCount=0;
附判断一个view是否在当前窗口
#import &UIView+HQExtension.h&
@implementation UIView (HQExtension)
-(BOOL)isShowingInWindow{
//拿到主窗口
UIWindow *window=[UIApplication sharedApplication].keyW
//转换坐标系
CGRect newFrame=[window convertRect:self.frame fromView:self.superview];
//判断当前view的frame是否在窗口内
BOOL isIn=CGRectIntersectsRect(newFrame, window.bounds);
return !self.hidden&&self.alpha&0.01&&self.window==window&&isIn;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:343001次
积分:15556
积分:15556
排名:第510名
原创:1206篇
转载:321篇
(2)(2)(5)(3)(3)(40)(218)(205)(180)(7)(1)(9)(1)(31)(41)(45)(27)(31)(11)(3)(37)(104)(60)(489)}

我要回帖

更多关于 uiviewcontroller横屏 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信