1.能够使用代码和storyboard设置collectionView的组头和组尾视图
2.能够说出UIApplication对象的含义,使用代码获取UIApplication对象,并使用UIApplication对象实现应用级别的操作(例如,在手机桌面显示badge,打电话,打开网页,操作网络连接指示器等)
3.能够说出AppDelegate的代理方法什么时候会被调用
4.能够说出main函数里各个参数的含义,并说出应用程序的启动过程
5.能够说出UIWindow的本质,使用代码创建一个UIWindow,并指定UIWindow的根视图控制器。
6.能够说出UIApplication,UIApplicationDelegate,UIViewController以及UIWindow之间的关系。
7.能够说出多控制器的使用场景,说出常用的多控制器(导航控制器和tabBar控制器)
8.能够使用拖线的形式在storyboard里添加导航控制器,并实现界面的跳转。
9.能够使用代码创建导航控制器,把导航控制器设置为根视图控制器,并在导航控制器里添加子控制器。
10.能够使用代码设置导航控制器的相关属性,并实现界面的跳转。
11.能够使用storyboard创建UITabBarController,添加子控制器,并设置子控制器的相关属性。
12.能够使用代码创建UITabBarController,设置UITabBarController为根视图控制器,添加子控制器并设置子控制器的属性。
13.能够说出点击其它控制器时,并不会销毁已创建的控制器。
```
###02-collectionView组头/组尾使用
-步骤:
因为穿件出来的Colltionview是没有颜色的所以要给colltionview创建颜色
self.collectionView.backgroundColor= [UIColorwhiteColor];
-创建项目
-展示出普通的带背景颜色的cell
创建cell的时候显先进行注册
注册cell
[self.collectionViewregisterClass:[UICollectionViewCellclass]forCellWithReuseIdentifier:ID];
// 1.创建cell
UICollectionViewCell*cell = [collectionViewdequeueReusableCellWithReuseIdentifier:IDforIndexPath:indexPath];
-注册header/footer的单元格
//注册头部
[self.collectionViewregisterClass:[UICollectionReusableViewclass]forSupplementaryViewOfKind:UICollectionElementKindSectionHeaderwithReuseIdentifier:HeaderID];
//注册尾部
[self.collectionViewregisterClass:[UICollectionReusableViewclass]forSupplementaryViewOfKind:UICollectionElementKindSectionFooterwithReuseIdentifier:FooterID];
-在数据源方法'viewForSupplementaryElementOfKind'中去缓存池找
//返回每一组的头部或尾部视图
也遵守了UICollectionViewDataSource这个协议
- (UICollectionReusableView*)collectionView:(UICollectionView*)collectionView viewForSupplementaryElementOfKind:(NSString*)kind atIndexPath:(NSIndexPath*)indexPath {
NSLog(@"%@", kind);
//如果当前想要的是头部视图
UICollectionElementKindSectionHeader是一个常量字符串
头尾也是跟cell的创建差不多,会先从从缓存池中找找不到然后创建,创建之前要先进行注册
if(kind ==UICollectionElementKindSectionHeader) {
UICollectionReusableView*headerView = [collectionViewdequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeaderwithReuseIdentifier:HeaderIDforIndexPath:indexPath];
headerView.backgroundColor= [UIColorgreenColor];
returnheaderView;
}else{//返回每一组的尾部视图
UICollectionReusableView*footerView = [collectionViewdequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooterwithReuseIdentifier:FooterIDforIndexPath:indexPath];
footerView.backgroundColor= [UIColorpurpleColor];
returnfooterView;
}
}
-在layout中设置referenceSize大小
使用collection要进行设置layout
#warning mark -如果有class来注册这个头部或尾部视图时一定要用代码的方式去设置下这个头部或尾部的尺寸
self.flowLayout.headerReferenceSize=CGSizeMake(150,150);
self.flowLayout.footerReferenceSize=CGSizeMake(50,50);
#warning mark -当滚动方向发生颠倒时头或尾的尺寸设置也会发生颠倒
self.flowLayout.scrollDirection=UICollectionViewScrollDirectionHorizontal;
-设置pinToVisibleBounds属性
self.flowLayout.sectionHeadersPinToVisibleBounds=YES;这个方法是让头停留固定
等这些事iOS9.0之后的新特性使用的时候一定要注意版本
-想显示组头/组尾最重要的三步,注册头或尾,获取dequeue,通过layout设置大小
- pinToVisibleBounds属性可以固定组头和组尾
###03-UIApplication对象
- Application是单例
- iOS程序创建的**第一个对象**就是UIApplication对象
- [UIApplication sharedApplication]可以获得这个单例对象
- //判断是否是iOS8以上版本
= #define KiOS8 [[UIDevice currentDevice].systemVersion floatValue] >= 8.0
-属性:
- applicationIconBadgeNumber设置右上角提醒数字(权限)
- networkActivityIndicatorVisible网络指示器的显示
- openURL:
```
URL统一资源定位符
协议头://资源路径/资源
本地
file://desktop/文件夹/xxxx/123.png
网络
http://www.baidu.com/index.html
打电话:
tel:10086
发短信
sms:10086
发邮件:
mailto:[email protected]
```
//点击屏幕上的view会调用此方法
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event {
//获取应用程序对象"它是单例对象"
UIApplication*app = [UIApplicationsharedApplication];
// if (KiOS8) {
//
// //通知设置
// UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
// //注册通知
// [app registerUserNotificationSettings:setting];
// }
// //设置应用图标右上角的提示数字
// app.applicationIconBadgeNumber = 998;
//设置应用联网状态
// app.networkActivityIndicatorVisible = YES;
// NSURL统一资源定位符"一定要写全了要有协议头"
NSURL*url = [NSURLURLWithString:@"http://www.baidu.com"];
//打开指定路径的东西"可以打电话/发短信/跳转到其它应用"
[appopenURL:url];
}
###04-AppDelegate应用程序代理
这是在AppDelegate。m的文件中加载的
app delegate这个是个代理它内的方法全部用代理其中有
```
//程序第一次加载完毕
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
这是程序的开始程序这个方法我们用的最多
//程序已经进入后台
//保存数据
- (void)applicationDidEnterBackground:(UIApplication*)application
//程序将要进入前台
//恢复数据
- (void)applicationWillEnterForeground:(UIApplication*)application
//程序将要失去焦点-不能交互
- (void)applicationWillResignActive:(UIApplication*)application
//程序已经获取焦点-可以交互
- (void)applicationDidBecomeActive:(UIApplication*)application
//程序挂了
//注意:1.用户主动关闭2.系统因为内存不够关闭了程序
- (void)applicationWillTerminate:(UIApplication*)application
//程序接收到内存警告
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
###05-UIApplicationMain函数/程序启动过程
- main函数中执行了一个UIApplicationMain这个函数
- UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
-参数:
- argc、argv:直接传递给UIApplicationMain进行相关处理即可
- principalClassName:指定应用程序类名(app的象征),该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值
- delegateClassName:指定应用程序的代理类,该类必须遵守UIApplicationDelegate协议
- UIApplicationMain函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性
-接着会建立应用程序的Main Runloop(事件循环),进行事件的处理(首先会在程序完毕后调用delegate对象的application:didFinishLaunchingWithOptions:方法)
-程序正常退出时UIApplicationMain函数才返回
###06-UIWindow/使用纯代码加载根控制器
- UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow
- iOS程序启动完毕后,创建的**第一个视图控件**就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了
-一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow
-也就说,没有UIWindow,就看不见任何UI界面
```
//让当前UIWindow变成keyWindow,并显示出来
- (void)makeKeyAndVisible;
///获取当前应用程序的主窗口
- [UIApplication sharedApplication].keyWindow
//获取view对象所在的窗口
- view.window
//获取当前程序所有的window
- [UIApplication sharedApplication].windows
```
案例
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
// 1.创建window
self.window= [[UIWindowalloc]initWithFrame:[UIScreenmainScreen].bounds];
self.window.backgroundColor= [UIColoryellowColor];
//创建控制器
UIViewController*vc = [[UIViewControlleralloc]init];
vc.view.backgroundColor= [UIColorpurpleColor];
//给窗口指定一个根控制器
self.window.rootViewController= vc;
// [self.window addSubview:vc.view];
//让窗口成为主窗口并显示出来
[self.windowmakeKeyAndVisible];
//获取当前的主窗口
// UIWindow *w = [UIApplication sharedApplication].keyWindow;
#warning mark -应用程序中窗口可以有多个,但是主窗口只会有一个
//获取应用程序中的所有窗口
// NSArray *windows = [UIApplication sharedApplication].windows;
// NSLog(@"%@", windows);
//获取当前的view所在的窗口
UIWindow*viewWindow = vc.view.window;
NSLog(@"%p ---%p", viewWindow,self.window);
returnYES;
}
###07-四大对象关系
```
与安卓中的四大关系不同
四大对象关系
1.UIApplication :delegate属性
2.AppDelegate :window属性
3.UIWindow :rootViewController属性
4.UIViewController :view属性
第一个创建的对象是UIApplication
UIApplication绑定一个AppDelegate对象
AppDelegate对象中有一个window属性(UIWindow)
UIWindow对象中有一个rootViewController的属性
rootViewController设置成要显示的UIViewController
最后显示出UIViewController对象的view
```
###08-多控制器概述
-一个iOS的app很少只由一个控制器组成,除非这个app极其简单
-当app中有多个控制器的时候,我们就需要对这些控制器进行管理
-有多个view时,可以用一个大的view去管理1个或者多个小view
-控制器也是如此,用1个控制器去管理其他多个控制器
-比如,用一个控制器A去管理3个控制器B、C、D
-控制器A被称为控制器B、C、D的“父控制器”
-控制器B、C、D的被称为控制器A的“子控制器”
-为了便于管理控制器,iOS提供了2个比较特殊的控制器
- UINavigationController
- UITabBarController
###09-导航控制器-体验
- UINavigationController的使用步骤
-初始化UINavigationController
初始化UINavigationController时可以直接alloc init创建也可以创建的时候给加上子控制器initwith。。。
也可以分这加
[*** addchileviewcontroller:**]来添加
也可以用
***. viewcontrollers = @[##,##,##]
来添加
***.chileviewcontrollers= @[##,##,##]
这两个不同点
viewControllers是导航控制器的属性,此属性可以用来添加子控制器,也可以获取当前导航控制器中所有的子控制器
childViewControllers:是viewController的属性,它是一个只读的属性,它只可以用来获取子控制器,不能添加子控件
-设置UIWindow的rootViewController为UINavigationController设置窗口的根控制器
-根据具体情况,通过push方法添加对应个数的子控制器
[navpushViewController:vcanimated:YES];
[navpushViewController:vc1animated:YES];
注意这添加的子控件不是直接加在后面的而是在同一个一面来了之后把上衣一个推走了
###12-导航控制器-结构/总结
-导航条多高?
- 44
- UINavigationController是以什么形式保存子控制器?
-栈
-如果获取UINavigationController下面的所有的子控制器
- viewControllers / childViewControllers
-如何跳转页面?
- //将指定控制器压入栈中
- -(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
-如何返回页面?
- //将栈顶的控制器移除
- -(UIViewController *)popViewControllerAnimated:(BOOL)animated;
- //回到指定的子控制器"子控制器只能获取当前栈中的,不能新创建"
- -(NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
- //回到根控制器(栈底控制器)
- -(NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
-通过哪个对象可以修改导航栏的内容?
-导航栏的内容由栈顶控制器<当前屏幕显示界面的控制器>的navigationItem属性决定
- navigationItem常用属性?
- UINavigationItem有以下属性影响着导航栏的内容
-左上角的返回按钮
- @property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
-中间的标题视图
- @property(nonatomic,retain) UIView *titleView;
-中间的标题文字
- @property(nonatomic,copy) NSString *title;
-左上角的视图
- @property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
-右上角的视图
- @property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;
-导航条中按钮使用原始图片不进行系统渲染
- [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
-导航控制器小结:
```
是以栈的形式来管理子控制器的,先进后出原则FIFO ""first in first out""
push的过程叫做进栈入栈给导航控制器添加子控制器
pop的过程叫做出栈弹栈,移除导航控制器中相应的子控制器
最上面的控制器当前最后入栈的控制器也叫栈顶控制器
最下面的控制器也就是第一个添加的控制器为栈底控制器,根控制器
navigationController和navigationItem都是通过"控制器"对象调用的
navigationBar是通过"导航控制器"对象调用的
如果想改变导航条整体的样式那么应该找navigationbBar
这个实在navigtaioncontroller里面的
如果想改变导航条上内容找navigationItem