我爱编程

UI总结

2018-04-16  本文已影响0人  爱炸毛的小鸡崽子

一:项目中的常见文件
1.Tests文件夹:单元测试
2.Frameworks:依赖的框架
3.Info.plist: 项目配置文件.程序加载首先加载配置文件.
3.1 Localiztion native development region(CFBundleDevelopmentRegion) 本地化相关
3.2 Bundle display name(CFBundleDisplayName) 程序安装后显示的名称,限制在10-12个字符
3.3 Icon file(CFBundleIconFile) app图标名称,一般为Icon.png
3.4 Bundle version(CFBundleShortVersionString) 应用程序版本号,每次发布appstore时需要增加这个版本号
3.5 Main storyboard file base name(NSMainStoryboardFile) 主storyboard文件的名称
3.6 Bundle identifier(CFBundleIdentifier) 项目唯一标识,部署真机时使用
4.Info.plist对应xcode的图形界面,改变图形界面,就会改变Info.plist.
5.pch文件: Supporting files文件夹下"工程名-Prefix.pch"的文件,是一个头文件,能被项目中的其他所有源文件共享和访问.
5.1 pch文件的作用
1.放一些全局的宏.
2.导入一些全局都需要的头文件.
3.管理日志输出
日志输出是非常消耗性能的,发版时候不需要日志输出,只有debug才需要.
5.2 自定义输出,不要使用系统自带的NSLog

define NQQLog(...) NSLog(VA_ARGS)

//标识可接受任何参数
VA_ARGS 标识左边...的参数会替代到右边NSLog中.
1.如果不想打印了,直接注释后面的 #define NQQLog(...) // NSLog(VA_ARGS)
2.还可以使用条件编译
#ifdef DEBUG //调试阶段
#define NQQLog(...) NSLog(VA__ARGS)
#else //发版阶段
#define NQQLog(...)
#endif

5.3 在pch写的有关oc代码,最好放在#define OBJC , xcode在每个oc文件中都定义了这个宏,只有oc文件才有这些宏.

二.UIApplication
1.UIApplication不能手动创建,一个app只允许有一个.
每一个app都有自己的UIApplication对象,并且是单例的.
[UIApplication sharedApplication]可以获得这个单例对象
一个app启动后创建的第一个对象就是UIApplication对象.
2.UIApplication的作用: 做应用级别的操作
2.1 app红色提醒数字
@property(nonatomic) NSInteger applicationIconBadgeNumber;
2.2 显示联网状态可见性
@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
2.3 打开一个资源

3.openURL:
//UIApplication有个功能强大的openURL方法

//打电话
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@"tel://10086"];

//发短信
[app openURL:[NSURL URLWithString:@"sms://10086"];

//发邮件
[app openURL:[NSURL URLWithString:@"mailto://328477273@qq.com"];

//打开一个网页资源
[app openURL:[NSURL URLWithString:@"http://www.jianshu.com"];

4.UIApplication打开资源的好处:不用判断用什么软件打开的,系统会根据协议头判断.

5.UIApplication管理状态栏, iOS7后提供了2种管理状态栏的方式
5.1 通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏).
5.2 通过UIApplication管理(一个应用程序状态栏都由它同一个管理)
//如果想利用UIApplication管理状态栏,首先要修改Info.plist


image.png

5.3 iOS7,默认下,状态栏都是由UIViewController管理的
//状态栏样式

//状态栏的可见性

三.UIApplication 和 delegate

  1. 所有的移动操作系统都有一个致命的缺点,app容易受到打扰.比如来电或者锁屏会导致app进入后台甚至被终止.

在app收到干扰时,会产生一些系统事件,此时UIApplication会通知它的delegate对象,让delegate代理对象来处理这些系统事件.

AppDelegate就是UIApplication的代理.
AppDelegate默认遵守了UIApplicationDelegate协议.


image.png
  1. app启动过程:
    2.1 创建application, 创建并设置application的代理.
    2.2 开启事件循环,不断监听事件.如果产生系统事件,就会通知代理,其他事件,会找到一个合适的视图处理事件.
    2.3 只有应用程序关闭,才会结束程序.

UIApplicationMain函数会开启一个事件循环,并不会马上就执行完毕.
底层机制:
创建UIApplication对象和UIApplicationDelegate对象,设置UIApplication的代理,开启事件循环,监听系统事件.

2.4 delegateClassName不能传nil,意味着application没有代理,就无法监听系统的事件,系统的事件都没法监听,窗口都不知道什么时候去加载, 由于视图都是懒加载的,因此就不会创建窗口,什么也没有.
2.5 principalClassName传nil,默认是UIApplication,创建一个UIApplication对象.

2.6 UIApplication代理的作用: 处理系统事件,不是任何事件都交给它处理, 按钮点击,屏幕点击都不是它处理, 是由UIApplication处理.
2.6.1 加载完成,初始化操作
2.6.2 进入后台: 一般在这里保存应用的数据(游戏数据,暂停游戏)
2.6.3 内存警告: 清空不必要的内容.

四.UIWindow
一种特殊的UIView,通常一个app中至少会有一个UIWindow.
app启动后,创建的第一个视图控件就是UIWindow,接着创建控制器的View,最后将控制器的View添加到UIWindow上.没有UIWindow就看不见任何东西.

1.添加UIView到UIWindow
//直接将view添加到UIWindow中,但并不会理会view对应的UIViewController

//自动将rootViewController的view添加到UIWindow中,管理rootViewController的生命周期.
@propery(nonatomic,retain) UIViewController *rootViewController;

//让当前UIWindow变成keyWindow

//让当前UIWindow变成keyWindow,并显示出来
-(void)makeKeyAndVisible;

  1. UIWindow的获得
    2.1 [UIApplication sharedApplication].windows
//用来接收键盘一集非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow.如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow.
2.2 [UIApplication sharedApplication].keyWindow

//获得某个UIView所在的UIWindow
view.window
image.png

关于UIWindow的一些补充:
window层级: UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert
UIWindowLevelNormal : 默认窗口的层级.
UIWindowLevelStatusBar : 状态栏,键盘.
UIWindowLevelAlert : UIActionSheet,UIAlertView
把window的层级设置为UIWindowLevelAlert,就会显示在最前面.

五.控制器的创建
1.怎么自己通过storyboard创建控制器(空项目),之前都是系统加载 storyboard,帮我们创建好控制器。
• 了解UIStoryboard对象,通过这个对象,就能加载storyboard文件 注意:必须要有storyboard,创建UIStoryboard对象才有意义,alloc init创 建UIStoryboard对象没有意义
1.1> instantiateInitialViewController:默认加载箭头指向的控制器
1.2> instantiateViewControllerWithIdentifier:根据标识在storyboard查找 控制器,并且创建。
○ 标识不能乱传,会报错的,必须storyboard有这个标识才行。
1.3> 现在创建的控制器都不能处理事件,如果需要处理事件,需要自定 义控制器。
• 现在创建的控制器为什么不能处理事件?
• 原因:当通过storyboardID找到storyboard中的控制器的时候,就会
创建storyboard中描述的控制器对象,创建对象首先得知道类名, 会根据storyboard中的Custom Class确定类名,然后创建对象,默认 都是系统自带的对控制器对象,系统自带的是不能处理事件的。他 不能写监听方法。

记住:要想处理控制器事件,必须自定义控制器。
2.模仿系统怎么通过main.storyboard加载程序的。(带storyboard的项目) 1> 带有storyboard的程序,默认程序一启动,就会加载storyboard,自动 创建好窗口和根控制器。
2> 系统怎么判断需不需加载storyboard?主要看有没有设置主界面,如果 设置了Main,就会去加载Main.storyboard.

3> 在新增一个storyboard文件,怎么加载新增的storyboard,修改主界 面。
4> 模仿程序一启动就加载Main.storyboard文件,创建窗口,创建箭头指
向的窗口根控制器,并且显示窗口。
• 先清空主界面设置,需要删除缓存。
3> storyboard storyboard
面。
4> 模仿程序一启动就加载Main.storyboard文件,创建窗口,创建箭头指
向的窗口根控制器,并且显示窗口。
• 先清空主界面设置,需要删除缓存。

image.png
  1. 通过xib创建控制器的view(空项目) • 首先得要有xib。
    3.1 xib注意点:(演示没有的后果)
    1> xib里面必须有一个view描述控制器的view,因为控制器的view 属性必须有值。
    2> xib需要指定描述哪一个控制器,描述UIView不需要,因为xib里 面可以描述很多UIView,不能固定死,但是控制器就不一样了,一个 xib就用来描述一个控制器。
    3> xib里面可能有很多view,需要拖线指明哪个是控制器的view
    3.2 xib和storyboard的区别 storyboard已经指定了控制器的view,不需要我们管,xib需要我们 手动管理。

六.控制器view的创建
1.控制器view的加载,首先要自定义控制器view,作为根控制器.
2.直接通过alloc init创建的控制器的view默认就是透明的.
3.重写控制器的loadView,不会去加载storyboard.
4.解释loadView方法
4.1 loadView作用: 用来创建自定义view
4.2 loadView调用时机: 当控制器view没有创建时,就会调用loadView创建控制器的view.
4.3 loadView使用注意: 如果重写loadView里面没有创建控制器的view,就不能使用self.view, 会造成死循环.


image.png

5.通过xib加载控制器的view
NQQViewControllerAAA的xib描述控制器的view,通过这个xib加载控制器的view
NQQViewController的xib描述控制器的view,不用告诉控制器去加载哪个xib,会自动去加载NQQViewController这个xib.
NQQView的xib描述控制器的view,通过这个xib加载控制器的view,不用告诉控制器去加载哪个xib,优先去加载NQQView这个xib

6.控制器View的优先级:
重写loadView > storyboard > nibName > xib

7.控制器的view是延迟加载的

上一篇下一篇

猜你喜欢

热点阅读