|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
当时要是有人告诉我这些估计少走不少弯路还有提醒各位初学者刚开始学的时候会有几个月的低谷期很容易放弃如果挺过最开始的几个月后来就越学越容易了在iOS5.0之前,视图把持器容器只属于苹果体系一切,苹果不倡议你自界说视图把持器容器。实践上,在视图把持器编程指南这一章中明白告诉我们不要利用它。之前苹果公司关于视图把持器容器的整体形貌是“一个办理全部屏幕内容的视图把持器”,而如今的形貌是“一个包括自己视图内容的单位汇合”。为何苹果不但愿我们自界说像tabbarcontrollers和navigationcontrollers如许的视图把持器容器呢?更正确的说,上面这条语句会带来甚么成绩:
1
[viewControllerA.viewaddsubView:viewControllerB.view]
<br>
UIWindow作为使用程序的根视图,卖力监听和分发屏幕扭转和视图结构等动静。在上图中,ViewController的view拔出到根视图把持器傍边的一个视图中作为其子视图,那末这个view就不会再吸收到UIWindow传来的动静,像viewWillAppear:这类办法就不会被挪用。
在ios5.0之前我们自界说的视图把持器容器,将会持有子类视图把持器的一个援用,而且必要我们手动的传送在父类视图把持器中挪用的事务动静给子类视图把持器,正确地完成这项事情太难了!
实例详解:
小时分你在沙岸游玩时,你的怙恃是不是曾告知过你:假如你用你的小铁锹一向挖,一向挖,终极你能挖到地球劈面的中国往(作者在美国)。我怙恃曾如许给我说过,我做了一个叫Tunnel的使用来查验一下这个概念。你能够附加上GitHubRepo并运转这个程序,如许能够更好的匡助你了解这个实例。
<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> |
|