仓酷云

标题: IOS编程:iOS系列译文:视图把持器容器详解仓酷云 [打印本页]

作者: 精灵巫婆    时间: 2015-1-18 11:37
标题: IOS编程:iOS系列译文:视图把持器容器详解仓酷云
当时要是有人告诉我这些估计少走不少弯路还有提醒各位初学者刚开始学的时候会有几个月的低谷期很容易放弃如果挺过最开始的几个月后来就越学越容易了在iOS5.0之前,视图把持器容器只属于苹果体系一切,苹果不倡议你自界说视图把持器容器。实践上,在视图把持器编程指南这一章中明白告诉我们不要利用它。之前苹果公司关于视图把持器容器的整体形貌是“一个办理全部屏幕内容的视图把持器”,而如今的形貌是“一个包括自己视图内容的单位汇合”。为何苹果不但愿我们自界说像tabbarcontrollers和navigationcontrollers如许的视图把持器容器呢?更正确的说,上面这条语句会带来甚么成绩:
1
[viewControllerA.viewaddsubView:viewControllerB.view]

IOS编程:iOS系列译文:视图把持器容器详解仓酷云
登录/注册后可看大图

<br>
UIWindow作为使用程序的根视图,卖力监听和分发屏幕扭转和视图结构等动静。在上图中,ViewController的view拔出到根视图把持器傍边的一个视图中作为其子视图,那末这个view就不会再吸收到UIWindow传来的动静,像viewWillAppear:这类办法就不会被挪用。
在ios5.0之前我们自界说的视图把持器容器,将会持有子类视图把持器的一个援用,而且必要我们手动的传送在父类视图把持器中挪用的事务动静给子类视图把持器,正确地完成这项事情太难了!
实例详解:
小时分你在沙岸游玩时,你的怙恃是不是曾告知过你:假如你用你的小铁锹一向挖,一向挖,终极你能挖到地球劈面的中国往(作者在美国)。我怙恃曾如许给我说过,我做了一个叫Tunnel的使用来查验一下这个概念。你能够附加上GitHubRepo并运转这个程序,如许能够更好的匡助你了解这个实例。
IOS编程:iOS系列译文:视图把持器容器详解仓酷云
登录/注册后可看大图

<br>
假如想取得以后地位绝对面的地址(地球的劈面),挪动拿着铁锹的谁人君子,舆图会告诉你正确的出口地位。触摸一下雷达按钮,舆图就会翻转并显现切实的地名。
在以后的屏幕上,有两个舆图视图把持器,每一个都必要处置拖拽,标注地位,另有更新舆图这些事务。翻转页面后会出现劈面地址的两个舆图视图把持器。一切的这些视图把持器都存在于一个父类视图把持器容器中,这些视图把持器持有各自的视图,以确保视图的结构和翻转能够准确的举行。
根视图把持器具有两个视图容器,增加两个的目标就是为了更便利各自容器的子视图举行结构,实行动画等操纵,上面我们来注释一下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-(void)viewDidLoad
{
[superviewDidLoad];
//Setupcontrollers
_startMapViewController=[RGMapViewControllernew];
[_startMapViewControllersetAnnotationImagePath:@"man"];
[selfaddChildViewController:_startMapViewController];//1
[topContaineraddSubview:_startMapViewController.view];//2
[_startMapViewControllerdidMoveToParentViewController:self];//3
[_startMapViewControlleraddObserver:self
forKeyPath:@"currentLocation"
options:NSKeyValueObservingOptionNew
context:NULL];
_startGeoViewController=[RGGeoInfoViewControllernew];//4
}

_startMapViewController用来显现入手下手的地位,先实例化并用标注图片初始化。
1._startMapViewController作为根视图把持器的一个子视图,增加到个中,子类中的willMoveToParentViewController:办法将会主动实行。
2.下面的子类视图作为第一个视图容器的视图的子视图增加到个中。
3.子视图收到一个关照,它如今有了一个父视图。
4.举行地舆地位编码的子视图把持器被初始化,可是如今还没有被拔出就任何视图或把持器布局中。
结构
根视图把持器界说的两个视图容器分离决意了它们的子视图把持器的巨细。子类视图把持器不晓得本人将会增加到哪一个视图容器中,以是它们的size巨细必需可变的。
1
2
3
4
5
6
7
8
9
-(void)loadView
{
mapView=[MKMapViewnew];
mapView.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
[mapViewsetDelegate:self];
[mapViewsetMapType:MKMapTypeHybrid];
self.view=mapView;
}

如今它们会以父类视图的bounds来结构,如许增添了子类视图的复用性,假如我们把它推进导航把持器栈中,它们仍然会准确的结构。
转换效果
Apple供应的视图把持器容器的API是云云的具体,以致于我们几近能够以我们能想到的恣意体例来初始化容器大概实行各类动画。Apple还供应了便利利用的block办法来互换以后屏幕上的两个视图。
1
transitionFromViewController:toViewController:

下面这个办法为我们展现了很多细节
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-(void)flipFromViewController:(UIViewController*)fromController
toViewController:(UIViewController*)toController
withDirection:(UIViewAnimationOptions)direction
{
toController.view.frame=fromController.view.bounds;//1
[selfaddChildViewController:toController];//
[fromControllerwillMoveToParentViewController:nil];//
[selftransitionFromViewController:fromController
toViewController:toController
duration:0.2
options:direction|UIViewAnimationOptionCurveEaseIn
animations:nil
completion:^(BOOLfinished){
[toControllerdidMoveToParentViewController:self];//2
[fromControllerremoveFromParentViewController];//3
}];
}

1.我们增加的toViewController实行动画之前,fromViewController会收到一个将会移除的关照,假如fromViewController是容器视图品级的视图,那末此时把持器的viewWillDisappear:办法将会被挪用。
2.toViewController吸收到来自父类视图的动静,其对应的办法会被挪用。
3.fromViewController被移除。
下面的这个办法,能够主动转换出旧的视图并交换成新的视图。假如你想完成你本人的转换办法,而且想让每个时候都只能显现一个视图,你必需对旧的视图挪用removeFromSuperview办法,新的视图挪用addSubview:办法。挪用办法的序次假如堕落将会招致UIViewControllerHierarchyInconsistency告诫。好比在你增加视图之前挪用视图的didMoveToParentViewController:将会堕落。
为了可以利用UIViewAnimationOptionTransitionFlipFromTop动化序列,我们必需把子类视图增加到视图容器把持器上,而不是增加到根视图把持器上,不然的化,实行动画将会招致全部根视图翻转。
通讯
视图把持器应当是可以复用,包括以后视图的一个实体,子类视图也应当遵守这一履历法例。为了遵守这一法例,父类视图把持器应当只卖力两个义务:结构子类视图把持器的根视图,经由过程本身表露的API接口与子类视图把持器通讯,不该该间接修正子类视图的树形布局和形态。
在Tunnel使用实例中,父类视图把持器会合时监听mapviewcontrollers傍边的currentLocation属性。
<p>1
2
3
4
[_startMapViewControlleraddObserver:self
<p>
作者: 若天明    时间: 2015-1-21 11:18
然而,在vmware软件环境下,安装Mac OS X操作系统也是一件非常复杂的事情,而且还有可能花费了大量时间,最后却跑不起来。笔者也是经过了大量的实践,
作者: 透明    时间: 2015-1-30 16:51
自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉
作者: 不帅    时间: 2015-2-6 14:11
培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,
作者: 山那边是海    时间: 2015-2-16 10:38
因为我们老师也是自学的,给我们讲课说的最多的就是百度,谷歌,查文档。
作者: 第二个灵魂    时间: 2015-3-5 03:55
以上可以同时进行,学习过程中尽量不要纠结细节和底层,要知道ios是封闭的、OC是高级语言,我们不可能过多地去了解它的原理,至少在新手阶段没有必要。用迭代的方式更新你的知识,而不是死抠一个知识点。
作者: 再见西城    时间: 2015-3-11 23:13
中国如今已然发展成为一个软件大国,软件人才的数量跃居全球之首。当然,在苹果平台的开发领域,也保持了相当强劲的发展势头。然而,很多初入iOS开发门槛的开发者,
作者: 莫相离    时间: 2015-3-13 00:09
学习ios没什么捷径,关键在于多动手敲,曾看到前辈开玩笑说怎么快速学会某技术,答案是:“提高打字速度,快点写代码就能快点学会了”。
作者: 柔情似水    时间: 2015-3-19 18:14
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
作者: 再现理想    时间: 2015-3-20 07:45
因为我们老师也是自学的,给我们讲课说的最多的就是百度,谷歌,查文档。
作者: 老尸    时间: 2015-3-23 14:11
边吃零食边看Stanford的视频教程
作者: 冷月葬花魂    时间: 2015-4-2 15:05
最后在做项目的时候一定要认真对待,毕竟这个直接和你的就业挂钩,这也是锻炼你实际操作的能力。
作者: 飘灵儿    时间: 2015-4-2 23:47
培训时可以选择安卓,iOS,Java,因为实习的时候我选了安卓,当时实习时间只有三周,学的晕头转向,而java我也没学过,iOS的基础是C语言,这个大学里还是学过的,于是选择了iOS。
作者: 海妖    时间: 2015-4-21 21:11
每个行业都一样,想要一天学有所成是不可能的,一定要做好努力的准备,做ios不是简单的学会oc语言。不怕多走弯路,就怕不肯动手。
作者: 变相怪杰    时间: 2015-4-27 22:00
学习ios没什么捷径,关键在于多动手敲,曾看到前辈开玩笑说怎么快速学会某技术,答案是:“提高打字速度,快点写代码就能快点学会了”。
作者: 若相依    时间: 2015-6-18 04:36
首先是基础,在汉昌的课程非常全面。从object—c到最后的毕业项目,基本上方方面面都涉及到了,我是一名非计算机专业的学生,起初学习还有点吃力,因为基础知识薄弱。经常像听天书
作者: 分手快乐    时间: 2015-6-21 00:44
然而,在vmware软件环境下,安装Mac OS X操作系统也是一件非常复杂的事情,而且还有可能花费了大量时间,最后却跑不起来。笔者也是经过了大量的实践,
作者: 谁可相欹    时间: 2015-6-23 00:50
近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,
作者: 金色的骷髅    时间: 2015-7-10 04:16
最后在做项目的时候一定要认真对待,毕竟这个直接和你的就业挂钩,这也是锻炼你实际操作的能力。
作者: 兰色精灵    时间: 2015-7-12 17:08
培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2