09-UIKit(UICollectionViewController、UITabBarController)
目录:
一、UICollectionViewController
1 概念:从ios6开始,是一个变异的TableViewController,可以将其认为是一个二维表视图。
2 布局特点:Flow Layout流式布局
3 和TableViewController比较:
TableViewController CollectionViewController
section section
row item
cell cell
cell:UITableViewCell或子类cell:UICollectionViewCell
协议:
TableViewDatasource CollectionViewDatasource
三问 三问
TableViewDelegate CollectionViewDeletate
一响应 一响应
[1-CollectionViewController]
步骤:
1)创建MXCollectionViewController:UICollectionViewController(xib)
2)改变View的类型:
将xib中的view删除,在托一个UICollectionView,进行如下设置,将UICollectionView的datasource和delegate设置为Files Owner,将Files Owner中的view连线到UICollectionView
3)创建自定义的Cell类MXCell:UICollectionViewCell
4)创建自定义的cell的xib文件,托一个UICollectionViewCell到xib中,设置72X72加lablel控件
5)将Cell的xib文件的类型设置成MXCell,在将cell中的label拖成MXCell类的属性
6)设置UICollectionView的尺寸,每一个cell的大小,cell之间的间距,每一个section的内边距,以及CollectionView的头和脚高度
7)回答三问,多少区,每区多少个条目,每个条目的cell是什么样
二、UITabBarController(标签控制器)
1 控制器的控制器
2 创建
1)创建时经常需要先创建出要包含的多个继承自UIViewController的VC
2)用TabBarController包含这些VC
【2-tabBarController】
1 UITabBarController *tab = [[UITabBarController alloc] init]; 2 3 MXFirstViewController *first = [[MXFirstViewController alloc] initWithNibName:@"MXFirstViewController" bundle:nil]; 4 5 MXSecondViewController *second = [[MXSecondViewController alloc] initWithNibName:@"MXSecondViewController" bundle:nil]; 6 7 MXThreeViewController *three = [[MXThreeViewController alloc] initWithNibName:@"MXThreeViewController" bundle:nil]; 8 9 tab.viewControllers = @[first,second,three]; 10 11 self.window.rootViewController = tab;
3)tabBar中的按钮title和image需要配置:
在具体的VC中设置属性:
self.title 设置标题(一般显示在navigation上)
self.tabBarItem.title 设置tabBar标题
self.tabBarItem.image 设置tabBar图片
注意:先设置title,在设置tabBarItem.title,图片必须设置
注意:如果属性设置在viewDidLoad中运行的时候,第二第三个view的属性会看不到,因为只有点击这些页面的时候才会加载viewDidLoad,所以这些属性需要在每个VC创建的时候设置,具体在- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil中设置。
1 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 2 3 { 4 5 self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 6 7 if (self) { 8 9 // Custom initialization 10 11 self.tabBarItem.title = @"hellA"; 12 13 self.tabBarItem.image = [UIImage imageNamed:@"1"]; 14 15 } 16 17 return self; 18 19 }
3 tabBar和navigation一起使用
rootViewController是tabBar
【3-tabBar-naviga】
1)之间的关系:
1 MXFirstViewController *first = [[MXFirstViewController alloc] initWithNibName:@"MXFirstViewController" bundle:nil]; 2 3 MXSecondViewController *second = [[MXSecondViewController alloc] initWithNibName:@"MXSecondViewController" bundle:nil]; 4 5 UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:first]; 6 7 UINavigationController *navi2 = [[UINavigationController alloc] initWithRootViewController:second]; 8 9 UITabBarController *tab = [[UITabBarController alloc] init]; 10 11 tab.viewControllers = @[navi,navi2]; 12 13 self.window.rootViewController = tab;
2)推新界面时,push时默认新界面会保留TabBar,如果不希望看见,在push之前可以设置隐藏,present推新界面时,新界面不会出现tabBar。
1 - (void)viewDidLoad 2 3 { 4 5 [super viewDidLoad]; 6 7 self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(pushTap)]; 8 9 // Do any additional setup after loading the view from its nib. 10 11 } 12 13 - (void)pushTap{ 14 15 MXTableViewController *table = [[MXTableViewController alloc] initWithNibName:@"MXTableViewController" bundle:nil]; 16 17 table.hidesBottomBarWhenPushed = YES;//隐藏tabBar 18 19 [self.navigationController pushViewController:table animated:YES]; 20 21 }
三、视图和试图控制器的生命周期
1 viewController对象本身的创建和销毁
1)创建
init initWithXxx initWithNibName(使用xib初始化) initWithCoder(使用storyBoard初始化)
2)属性
私有属性@property(nonatomic,strong)NSMutableArray *data;一般会在init方法中创建此属性对应的对象。最好是在getter方法中创建,这样就只有需要使用此属性时才创建此对象(Lazy loading延迟加载)
公开属性一般是由外面赋值进来的,或是只读的。
3)释放
dealloc方法,在ARC下,此方法一般不太关注。
2 viewController对象的生命周期
1)视图创建(显示之前加载nib)
-> viewDidLoad 加载nib文件后调用,经常用于将数据赋值到显示界面的控件上
-> viewWillAppear 视图在显示之前调用,经常将更新界面的代码写在此处
2)视图可见
-> viewDidAppear 视图显示之后调用,当界面播放动画时用
-> viewWillDisappear 视图即将消失时调用
3)视图不可见
-> viewDidDisappear 视图消失后调用
如果在viewWillDisappear/ viewDidDisappear中分配某些资源,在这里释放这些资源
--------------特殊情况(了解)--------------
->didReceiveMemoryWarning系统内存低时调用
-> viewDidUnload 在ios6之后不再调用
【4-viewController-LifeCycle】
3 应用程序的生命周期
0)not running 非运行状态
1)前台foreground
inactive 前台非活动状态
active 活动状态
2)后台background
3)suspended挂起状态
【4-viewController-LifeCycle】
1 // 应用启动时调用,初始化根视图控制器,在storyBoard中可能没有任何代码 2 3 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 4 5 // 当程序从活动状态进入非活动状态时调用,比如有电话或短信进来,或用户按下home 6 7 // 在这个方法中你可以暂停正在处理的任务,禁用计时器,OpenGL ES帧率停掉,如果是游戏,在此方法中暂停游戏的运行resignActive辞去活动状态 8 9 - (void)applicationWillResignActive:(UIApplication *)application 10 11 { 12 13 NSLog(@"非活动状态"); 14 15 } 16 17 // 释放一些共享资源,保存用户数据,将计时器设为无效,保存应用程序的状态信息,以便将来使用 18 19 // 如果你的应用程序支持后台执行,当用户退出程序时会调用此方法enterBackground进入后台 20 21 - (void)applicationDidEnterBackground:(UIApplication *)application 22 23 { 24 25 NSLog(@"进入后台"); 26 27 } 28 29 // 将要进入前台时调用,从后台过度到非活动状态,可以撤销进入后台时的一些改变enterForeground进入前台 30 31 - (void)applicationWillEnterForeground:(UIApplication *)application 32 33 { 34 35 NSLog(@"进入前台"); 36 37 } 38 39 // 从非活动状态进入活动状态时调用,重新开始暂停的任务,如果应用程序是从后台进入的可以再次更新界面becomeActive变为活动 40 41 - (void)applicationDidBecomeActive:(UIApplication *)application 42 43 { 44 45 NSLog(@"活动状态"); 46 47 } 48 49 // 应用程序终止时调用,可以保存一些数据,terminate终止 50 51 - (void)applicationWillTerminate:(UIApplication *)application 52 53 { 54 55 NSLog(@"终止程序"); 56 57 }
四、其他控件
UISegmentedControl(分割)、
UIActivityIndicatorView(转圈)、
UIProgressView(进度条)
1 @property (weak, nonatomic) IBOutlet UIActivityIndicatorView *inditor; 2 3 @property (weak, nonatomic) IBOutlet UIProgressView *progress; 4 5 - (IBAction)segmenClick:(UISegmentedControl *)sender { 6 7 NSInteger index = sender.selectedSegmentIndex; 8 9 if (index == 1) { 10 11 [self.inditor stopAnimating]; 12 13 self.progress.progress = 0.2; 14 15 }else if(index == 0){ 16 17 [self.inditor startAnimating]; 18 19 } 20 21 NSLog(@"%d",index); 22 23 }