博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UITabBarController
阅读量:7008 次
发布时间:2019-06-28

本文共 4127 字,大约阅读时间需要 13 分钟。

多控制器管理 UITabBarController,跟UINavigationController类似,UITabBarController也可以轻松管理多个控制器,轻松完成控制器之间的切换,例如QQ,微信.

头文件定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@interface
UITabBarController : UIViewController <UITabBarDelegate,
NSCoding
>
 
@property
(
nonatomic
,
copy
)
NSArray
*viewControllers;
// If the number of view controllers is greater than the number displayable by a tab bar, a "More" navigation controller will automatically be shown.
// The "More" navigation controller will not be returned by -viewControllers, but it may be returned by -selectedViewController.
- (
void
)setViewControllers:(
NSArray
*)viewControllers animated:(
BOOL
)animated;
 
@property
(
nonatomic
,assign) UIViewController *selectedViewController;
// This may return the "More" navigation controller if it exists.
@property
(
nonatomic
)
NSUInteger
selectedIndex;
 
@property
(
nonatomic
,
readonly
) UINavigationController *moreNavigationController;
// Returns the "More" navigation controller, creating it if it does not already exist.
@property
(
nonatomic
,
copy
)
NSArray
*customizableViewControllers;
// If non-nil, then the "More" view will include an "Edit" button that displays customization UI for the specified controllers. By default, all view controllers are customizable.
 
@property
(
nonatomic
,
readonly
) UITabBar *tabBar
NS_AVAILABLE_IOS
(3_0);
// Provided for -[UIActionSheet showFromTabBar:]. Attempting to modify the contents of the tab bar directly will throw an exception.
 
@property
(
nonatomic
,assign)
id
<UITabBarControllerDelegate> delegate;
 
@end

 UITabBarController通过UITabBar *tabBar管理UITabBarItem, UITabBar默认高度49

  ios6以前控制器的高度是:屏幕的高低-状态栏高度-tabBar高度 ,ios7以后控制器的高度是屏幕的高度

UITabBar切换原理:tab切换获取控制器上的view,把view添加到屏幕上,屏幕上之前的view移开 并不会销毁,可以重复来回切换, 只有控制器销毁或内存警告时view才有可能消失.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
- (
BOOL
)application:(UIApplication *)application didFinishLaunchingWithOptions:(
NSDictionary
*)launchOptions {
    
NSLog
(@
"%s"
,__func__);
    
// Override point for customization after application launch.
    
self
.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
     
    
UITabBarController *tabBarVc = [[UITabBarController alloc] init];
     
    
UIViewController *vc1 = [[UIViewController alloc] init];
    
vc1.view.backgroundColor = [UIColor redColor];
    
UITabBarItem *barItem1 = vc1.tabBarItem;
    
barItem1.title = @
"消息"
;
    
[tabBarVc addChildViewController:vc1];
     
     
    
UIViewController *vc2 = [[UIViewController alloc] init];
    
vc2.view.backgroundColor = [UIColor greenColor];
    
UITabBarItem *barItem2 = vc2.tabBarItem;
    
barItem2.title = @
"好友"
;
    
[tabBarVc addChildViewController:vc2];
     
     
    
UIViewController *vc3 = [[UIViewController alloc] init];
    
vc3.view.backgroundColor = [UIColor blueColor];
    
UITabBarItem *barItem3 = vc3.tabBarItem;
    
barItem3.title = @
"动态"
;
    
[tabBarVc addChildViewController:vc3];
     
     
    
self
.window.rootViewController = tabBarVc;
     
    
[
self
.window makeKeyAndVisible];
     
    
return
YES
;
}

 

1
2
3
4
5
6
UITabBarController添加控制器的方式有2种
添加单个子控制器
- (
void
)addChildViewController:(UIViewController *)childController;
 
设置子控制器数组
@property
(
nonatomic
,
copy
)
NSArray
*viewControllers;

 

1
如果UITabBarController有N个子控制器,那么UITabBar内部就会有N个UITabBarButton作为子控件

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
UITabBarButton里面显示什么内容,由对应子控制器的tabBarItem属性决定
 
UITabBarItem有以下属性影响着UITabBarButton的内容
标题文字
@property
(
nonatomic
,
copy
)
NSString
*title;
 
图标
@property
(
nonatomic
,retain) UIImage *image;
 
选中时的图标
@property
(
nonatomic
,retain) UIImage *selectedImage;
 
提醒数字
@property
(
nonatomic
,
copy
)
NSString
*badgeValue;

 

被管理的控制器访问UITabBarController和tabBarItem,通过被管理的控制器去设置tabBarItem相应属性值

1
2
3
4
5
6
7
@interface
UIViewController (UITabBarControllerItem)
 
@property
(
nonatomic
,retain) UITabBarItem *tabBarItem;
// Automatically created lazily with the view controller's title if it's not set explicitly.
 
@property
(
nonatomic
,
readonly
,retain) UITabBarController *tabBarController;
// If the view controller has a tab bar controller as its ancestor, return it. Returns nil otherwise.
 
@end

 

 控制器view也是懒加载机制,用到时才创建显示

view生命周期:

UITabBarController管理的控制器,往回切换控制器中的view并不会销毁,这点跟导航控制器有区别(导航控制器返回时之前的显示的view会销毁)

 

app主流UI框架结构

转载地址:http://zqjtl.baihongyu.com/

你可能感兴趣的文章