UI总结

一:项目中的常见文件
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方法

  • (BOOL)openURL:(NSURL *)url;

//打电话
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管理的
//状态栏样式

  • (UIStatusBarStyle)preferredStatusBarStyle;

//状态栏的可见性

  • (BOOL)prefersStatusBarHidden;

三.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

  • (void)addSubView:(UIView *)view;

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

//让当前UIWindow变成keyWindow

  • (void)makeKeyWindow;

//让当前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是延迟加载的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容