关于ios开发视图的若干问题的探讨

1.概念问题:

一.什么是UIApplication?PPT演示

注意:UIApplication不能手动创建,不能alloc init,一个应用程序只允许

一个。

为什么要弄成单例,UIApplication对象是用来设置应用全局信息的,一个

应用程序如果有很多UIApplication对象,都不知道听谁的。

验证:单例和不能alloc,init

2.UIApplication的作用:做应用级别的操作

2.1>设置应用图标右上角的数字,图标需要手动清除,应用程序关闭,不

会自动清除.

applicationIconBadgeNumber

2.2>显示联网状态,告诉用户此应用正在联网networkActivityIndicatorVisible

2.3>打开一个资源3.URL:一个资源的唯一路径

3.1>网络资源URL的组成==协议头://主机域名/路径http://www.baidu.com/abc/1.png

3.2>本地资源URL的组成==协议头:///路径 本机域名可以不写file:///User/apple/Desktop/1.png

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

5.UIApplication管理状态栏.PPT演示

5.1> ios7默认交给控制器,需要配置下,不交给控制器管理,就会交个UIApplication管理。

5.2>动画隐藏状态栏

5.3>动画设置状态栏样式

二、UIApplication的Delegate

1.AppDelegate的作用:

•为什么要搞个AppDelegate,代理设计模式,有些事情自己不想处理,交

给别人处理

•怎么成为UIApplication的代理,遵守协议。

2.在哪设置UIApplication的代理,需要了解ios程序的启动过程.

2.1>创建application,创建并且设置application的代理

2.2>开启事件循环,不断监听事件。如果产生系统事件,就会通知代

理,其他事件,会找到一个最合适的视图处理事件。2.3>只有应用程序关闭,才会结束程序

3.UIApplicationMain函数:PPT演示

•注意UIApplicationMain函数会开启一个事件循环,并不会马上就执行完

毕。

•底层做的事情,创建UIApplication对象和UIApplicationDelegate对象,设置

UIApplication的代理,开启事件循环,监听系统事件。

3.1>delegateClassName不能传nil,这里传nil,意味着application没有代理,就无法监听系统的事件,系统的事件都没法监听,窗口都不知道什么时候去加载,因为视图都是懒加载的,因此就不会创建窗口,什么东西都没有。

3.2>principalClassName传nil,默认是UIApplication,创建一个

UIApplication对象。

4.UIApplication代理的作用:处理系统事件,不是任何事件都交给他处理,按

钮点击,屏幕点击都不是他处理,是由UIApplication处理。

2.1>加载完成,初始化的操作

2.2>进入后台:一般在这里保存应用的数据(游戏数据,比如暂停游戏)

2.3>内存警告:清空不必要的内容

三、window:通常一个app只会有一个UIWindow对象,但是可以创建多个,而iOS程序之所以能显示到屏幕上就是因为UIWindow,即:IOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view最后将控制器的view添加到了UIWindow上,于是控制器的view就显示在了屏幕上,自己创建窗口,窗口显示出来,两个条件。1.makeKeyAndVisible2.窗口不要被释放

注意:

1>keyWindow:makeKeyAndVisible会让窗口成为主窗口,并且显示出来,打印applic

2>创建的窗口交给windows这个数组管理: ?

○在创建一个窗口显示出来,一个应用程序只有一个主窗口,并且显示出来的窗口,application管理,application有个Windows数组,存放显示出来的窗口,有一个例外

态栏也是一个窗口,但是没有交给application管理。打印application.windows

3>还有那些是窗口?键盘也是窗口,创建一个textField成为第一响应者,并且加到最里

显示在最前面,打印application.windows,就知道了。

4>为什么他们会显示在最前面,因为窗口有层级,他们的层级高

5> windowLevel:UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert

UIWindowLevelNormal :默认窗口的层级UIWindowLevelStatusBar :状态栏,键盘、UIWindowLevelAlert:UIActionSheet,UIAlearView

6>把window的层级设置为UIWindowLevelAlert,就会显示在最前面。


四.UITableView和UIButton的层级结构(继承关系),一直到 NSObject .

(1)UITableView -> UIScrollView -> UIView -> UIResponder -> NSObject

(2)UIButton -> UIControl -> UIView -> UIResponder -> NSObject


五.关于响应者对象:

概念:在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。这种有响应和处理事件的对象,我们称之为“响应者对象”。UIApplication、UIViewController、UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件

响应者链的事件传递过程:(1)如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图(2)在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理(3)如果window对象也不处理,则其将事件或消息传递给UIApplication对象(4)如果UIApplication也不能处理该事件或消息,则将其丢弃

六、关于view的几个模糊点:

1、控制器的view的创建的决定权:重写loadView>storyboard>nibName>xib;

注意:loadView的使用方法

1> loadView作用:一般用来创建自定义的view

2> loadView什么时候调用:当控制器的view没有创建的时候,就会调用loadView去创建控制器的view.

3> loadView使用注意:如果重写loadView里面没有创建控制器的view,就不能使

用self.view,会造成死循环。

2.控制器的view是透明的:直接通过alloc,init创建的控制器的view默认是透明的

七、关于storyboard控制器的创建:

怎么自己通过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确定类名,然后创建对象,默认

都是系统自带的对控制器对象,系统自带的是不能处理事件的。他

不能写监听方法。

八、关于控制器的生命周期方法:

1>演示导航控制器根控制器View的生命周期(viewDidLoad这些view开头

的,称为生命周期方法)

•通过view的生命周期方法,就知道控制器的view是懒加载的,导航

控制器有2个子控制器,先会加载第一个子控制器的view,当Push

第二个的时候,才去加载第二个控制器的view

2>didReceiveMemoryWarning,当控制器接收内存警告的时候调用3>内存警告传递过程:手机内存不足产生事件->通知应用程序->调用应用程序代理方法->把事件传递给窗口->窗口传给控制器->调用控制器内存警告的方法。4>当控制器接收内容警告,会销毁没有显示的控制器的view。5>调用viewWillUnload,viewDidUnload,销毁控制器的view

6>viewDidUnload里面一般清空显示在view里面的数据,演示非arc开发

•为什么要清空显示view的数据:展示数据的view都不存在了,这些

数据也就没有用处了,因为数据主要是用来展示在view上的。

setDatas:(NSArray*)datas;

•建议使用nil,清空数据,在非arc和arc都通用。arc是不能使用release,而且非arc,self.datas = nil;做的事情更多。

7>didReceiveMemoryWarning会导致viewDidLoad重新调用。

○当收到内存警告,导航控制器的子控制器的view有可能被干掉,他

如果没有显示的话,当下次使用这个控制器的时候就会调用。

具体而言:

- (void)init; // 创建

- (void)loadView; // 构建视图层级结构

- (void)viewDidLoad; // 视图完成加载

- (void)viewWillAppear:(BOOL)animated; // 视图将要出现在屏幕上

- (void)viewWillLayoutSubviews; // 视图将要布局子视图,用代码调整控件布局才会使用

- (void)viewDidLayoutSubviews; // 视图布局子视图完成

- (void)viewDidAppear:(BOOL)animated; // 视图完成显示,视图已经出现在屏幕上

- (void)viewWillDisappear:(BOOL)animated; // 视图将要从屏幕上消失

- (void)viewDidDisappear:(BOOL)animated; // 视图已经从屏幕上消失

- (void)dealloc; // 释放视图控制器

九、导航控制器的使用

3.0>学一个新的控制器,先学他内部的结构和他的作用

• UINavgationViewController的内部结构(导航条,导航控制器的

view,存放导航控制器子控制器的view)

3.1>怎么添加导航控制器的子控制器,push,或者一创建的时候就给一个根控制器,默认第一个子控制器叫根控制器。

3.2>怎么管理很多子控制器?push很多控制器就OK了,不要一下子push很多子控制器,跳转控制器的权利应该交给用户,由用户决定进入那个界面。

3.3>通常开发中是给某个控制器添加导航功能,是点击某个控制器中的

控件,导航到另外一个控制器

•因此一开始只需要显示导航控制器的根控制器就好,具体需不需要

导航,由用户决定,如果需要导航,就点击跟控制器的按钮。

•导航控制器的作用:用来做导航功能,一个控制器如果想拥有导航

功能,就包装成导航控制器。

4> UINavgationViewController子控制器管理原理

4.1>导航控制器是通过栈管理子控制器,PPT分析,栈是先进后出4.2> push把控制器压入栈,然后创建控制器的view,把控制器的view在添加到导航控制器上

4.3>什么是栈顶和栈底控制器,栈底也叫导航控制器的根控制器。

4.4>显示到导航控制器的永远是栈顶控制器的view,栈底控制器的view不会被销毁,只是移除父视图。4.5>点击返回,移除栈顶控制器,移除的控制器会被销毁

5.导航控制器出栈操作

•首先了解topViewController和viewControllers和childViewControllers,出栈

的时候可能用到。

5.0. topViewController获取栈顶控制器。

5.1 viewControllers和childViewControllers:压入栈的控制器都会作为导航控制器的子控制器。

5.2通过pop手动出栈,之前都是点击back自动出栈。

5.3主动出栈,要求出栈的控制器必须是栈里面的控制器,不能自己创建

一个控制器出栈,会报出栈的控制器不存在的错误,这时候可以用

viewControllers或者childViewControllers拿到根控制器。

5.4 pop控制器,不会马上销毁栈顶控制器,而是告诉导航控制器需要把

栈顶控制器出栈,等到恰当的时间就会把栈顶控制器出栈,并且销

5.2通过pop手动出栈,之前都是点击back自动出栈。

5.3主动出栈,要求出栈的控制器必须是栈里面的控制器,不能自己创建

一个控制器出栈,会报出栈的控制器不存在的错误,这时候可以用

viewControllers或者childViewControllers拿到根控制器。

5.4 pop控制器,不会马上销毁栈顶控制器,而是告诉导航控制器需要把

栈顶控制器出栈,等到恰当的时间就会把栈顶控制器出栈,并且销

毁。(断点演示)

6.设置导航条的内容

6.1>一个导航控制器只有一个导航条,子控制器共用一个导航条。

6.2>如何设置导航条的内容,导航条的内容由栈顶控制器的navigationItem决定,因此导航控制器必须要有一个根控制器,本身不具备完整的显示功能,因为他的导航条他自己不能决定。

6.3>设置one控制器的导航条标题,显示one的时候,one就是栈顶控制

器,直接拿到navigationItem设置title.或者self.title

6.4设置navigationItem的titleView为UISegmentedControl,不需要设置位置,只需要设置尺寸。

6.5设置导航条左右两边按钮,按钮必须是

UIBarButtonItem.leftBarButtonItem,rightBarButtonItem,rightBarButtonItems

6.6导航条上的返回按钮由上一个控制器决定。

1>如果上一个控制器没有设置标题,默认back

2>如果上一个控制器设置标题,并且没有超过12个字符,默认返

回标题和上一个控制器一致,如果超过12个字符,就会变成back。

3>还可以主动直接设置下一个界面的返回按钮,设置上一个控制

器的backBarButtonItem属性

7.验证导航条的frame和导航控制器的内部结构,用一个UIView的分类。

1>导航条的的高度是44

2>利用UIView的分类,生成导航控制器view的内部结构的xml,写入桌面。

3> ios6和ios7导航控制器的区别。

8.导航控制器-利用storyboard创建

8.1>程序一启动,就加载导航控制器,设置storyboard箭头指向导航控制器

8.2>设置导航控制器的根控制器为UIViewController

8.3>设置导航条的内容,还有下一个控制器的返回按钮

8.4>利用storyboard做跳转,选中按钮拖线

8.5>利用按钮,回到上一个控制器,不能回拖,会新创建一个控制器,

只能通过代码。

UIView的常见属性:

1. 头UIView的设定

frame由系统决定- (UIView*) tableView …..viewforHeader…

2. 更改按钮中内部控件的位置

//关键:想更改内部控件的位置,先更改按钮水平方向上显示的方式

self.btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;

3. 不能响应交互的几种情况

3.1  alpha < 0.01的时候,就不可以被点击了

3.2 hidden属性 为YES

3.3 自身的 userInterAction被设置为了NO

3.4  父控件的userInterAction 设置为了NO

一个控件的事件响应,通常是先有它父控件获取到,如果子控件响应了,就结束,未响应就会传递给它的父控件

3.5 子控件超出父控件的部分,不可被点击

4. 图片变形问题

//变形self.btn.imageView.contentMode = UIViewContentModeCenter;

//取消系统默认截取子控件的功能self.btn.imageView.clipsToBounds = NO;

UIImageView.contentMode属性->拉伸方式分两种

UIViewContentModeScaleAspectFit,      只有有一个条件满足就不拉伸了

UIViewContentModeScaleAspectFill,    必须两个条件都满足

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

推荐阅读更多精彩内容