【ios视图的重新理解】

视图的重新理解

首先,在一个应用程序中,只有一个唯一的窗口对象,也就是 window,之后的各种视图添加的过程就是在这个 window 的上面添加各个 view,就像在一块黑板上面贴了各种各样的便签纸一样,只不过有的便签纸是智能的便签纸,可以和一个手机连接,由手机处理一些比较复杂的功能,这个手机就是视图控制器。如果说要再举一个例子的话,那么视图就像是富人家的大少爷,所有你能看到的好看的也好酷炫的也好都是少爷的面子,而视图控制器就像是少爷家的管家一样,帮着少爷处理好各种各样的事情。每个视图控制器可以有一个主视图,很多个其他的小视图。主视图就是控制器的 view 属性。

不过有的视图控制器比较特殊,比如导航视图控制器 UINavigationController,这个控制器会控制其他很多的控制器的出现与否,就好像一个总管家一样。

大致的理解定位了以后,来看看都有哪些视图的函数会被调用(以下是按照顺序写的,实际视图生成时调用顺序就是下面的顺序)。

 1
 2
 3 #pragma mark -viewLoading
 4
 5 - (void)viewDidLoad
 6
 7 {
 8
 9     [super viewDidLoad];
10
11 // Do any additional setup after loading the view, typically from a nib.
12
13     LOG(@"hello");
14
15     LOGSize(self.view.frame.size);
16
17     LOGRect(self.view.frame);
18
19     LOGPoint(self.view.frame.origin);
20
21 }
22
23 -(void)viewWillAppear:(BOOL)animated
24
25 {
26
27     [super viewWillAppear:animated];
28
29 }
30
31 //ios6之后有的方法,当主视图发生变化的时候会进行调用,比如屏幕旋转
32
33 -(void)viewWillLayoutSubviews
34
35 {
36
37
38
39 }
40
41 -(void)viewDidLayoutSubviews
42
43 {
44
45
46
47 }
48
49 -(void)viewDidAppear:(BOOL)animated
50
51 {
52
53     [super viewDidAppear:animated];
54
55 }
56
57 #pragma mark viewDestroy
58
59 -(void)viewWillDisappear:(BOOL)animated
60
61 {
62
63     [super viewWillDisappear:animated];
64
65 }
66
67 -(void)viewDidDisappear:(BOOL)animated
68
69 {
70
71     [super viewDidDisappear:animated];
72
73
74
75 }

在来说说视图的旋转,旋转的话会调用以下的函数(按照以下的顺序)

//判断是否可以旋转

-(BOOL)shouldAutorotate

{

return YES;

}

//返回可以支持的旋转方向,ipad 默认是支持所有方向,iphone 是除了上下颠倒的其他方向。

-(NSUInteger)supportedInterfaceOrientations

{

return UIInterfaceOrientationMaskAll;

}

//在旋转之前,布局没有改变时候调用

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

{

LOG(@"还没开始");

LOGPoint(self.labForTest.frame.origin);

}

-(void)viewWillLayoutSubviews

{

LOG(@"要改变了");

LOGPoint(self.labForTest.frame.origin);

}

-(void)viewDidLayoutSubviews

{

LOG(@"改变完了");

LOGPoint(self.labForTest.frame.origin);

}

//所有的旋转后的布局已经结束

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

{

LOG(@"旋转后布局已经开始");

LOGPoint(self.labForTest.frame.origin);

}

//关于旋转的布局已经全部结束

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

{

LOG(@"全部结束");

LOGPoint(self.labForTest.frame.origin);

}

不过,要注意的是旋转之前两个 sunviews 的方法就会被调用,不知道为什么会这样,当一个视图出现的时候也是被调用了两次。同时,在以上最后一个方法调用的时候视图已经调整过来了,在之前都是没有调整过来的。所以可以在最后一个方法之前的方法中将当前的视图换为 IB 中自己设置为横向的视图,这样可以实现比较复杂的横竖屏切换,比如竖屏的时候有两个 label,横屏的时候有三个这样的 效果(生出来了?),就像 iPhone 的自带的计算器一样。效果就像下面这样:

实现的方式也很简单,就在最后一个方法之前的方法中写添加的代码就可以了:(下面代码中的 landscape 是在 IB 中创建的一个横向的视图,就是在右边设置就好,如图:)

//所有的旋转后的布局已经结束

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

{

LOG(@"旋转后布局已经开始");

LOGPoint(self.labForTest.frame.origin);

if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft||toInterfaceOrientation==UIInterfaceOrientationLandscapeRight) {

[self.view addSubview: landscapeView];

}

else{

[landscapeView removeFromSuperview];

}

}

在这里的实际编写还发现了一个小细节,就是如果在项目的 target 的设置中如果不把 UIDevice Oritation 加上 upsideDown(上下颠倒的方向),即使在 supportedInterfaceOrientations 方法中返回了全方向支持,也没有用,上下颠倒还是不能用。必须选中了才可以用,原因是 interfaceOrientation 是来自于 Decive Orientation 的。同时,视图控制器的主 view 在被替换之前必须要和视图控制器解除关系,否则就会报错,所以这里用了 addSubview 的方法,而不是直接替换。

另外,不仅视图可以多层进行开发,视图控制器也是可以多层开发的,同时控制器拥有回调函数,所以开发起来更为方便。一般这种多层视图开发用于构建自己的一个容器类的视图控制器。什么是容器类的视图控制器?就是像 NavigationController 一样的可以装载其他控制器的控制器。如果有的时候系统自带的方便的 Navigation 或者 Tabber 控制器不太灵活对应当前的开发需求,就可以自己写一个控制器。

写自定义多层控制器的方法其实很简单,首先作为一个能够控制其他视图控制器的控制器(有点拗口哈),肯定得能随时得到这些视图控制器啦,每一个视图控制器都有一个自己的方法去帮助开发者做这件事:

firstVC=[self.storyboard instantiateViewControllerWithIdentifier:@"one"];

[self addChildViewController:firstVC];

上面的第二个方法就会把一个视图控制器放到我们的主视图控制器的 childControllers 这个属性中,这是一个数组类型的属性,可以保存主视图控制器分管的其他的视图控制器。

然后再当前视图中设置一个你希望展示其他视图控制器的视图的子视图(图中白色的就是,为了看着方便),然后为其设置一个首先显示的视图:

[self.childView addSubview:firstVC.view];

self.currentVC=firstVC;

然后按钮的 action 设置为:

if (self.currentVC==firstVC) {

return;

}

[self transitionFromViewController:self.currentVC toViewController:firstVC duration:600 options:0 animations:nil completion:^(BOOL finished) {

self.currentVC=firstVC;

}];

第二个方法的作用就是吧当前视图中属于其他视图控制器的 子视图替换掉,变成别的视图控制器的视图,之所以进来先判断,是因为视图加载是需要时间的,如果不判断当用户连续点击按钮就会报错。

时间: 2024-08-01 22:48:09

【ios视图的重新理解】的相关文章

ios – 视图控制器如何管理视图?

移动设备的屏幕有限,所有的东西都需要放到一个单一窗口组成的单一界面显示,在ios中体现为视图切换(在<ios – 视图>中已经说明了视图),当一个视图替换掉另一个视图的时候,会经常使用动画效果,这个任务就是交给视图管理器来完成的. ios5之后应用程序窗口有一个根视图控制器(rootViewController),当不为rootViewController赋值时,会出现"Application windows are expected to have a root view cont

iOS关于代理的理解

直接上3个图,不知道说的对不对,欢迎大神指点 iOS关于代理的理解

IOS 视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途

iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidApper-UIViewController对象的视图已经加入到窗口时调用: viewWillDisappear-UIViewCont

IOS视图缩放显示动画效果

效果:视图从大--小缩放显示/小--大 (只是比例问题) 方法1.直接show出view的时候:把下面的这段代码加到viewController或者view出现的时候就OK self.view.transform = CGAffineTransformMakeScale(1.0f, 1.0f);//将要显示的view按照正常比例显示出来  [UIView beginAnimations:nil context:UIGraphicsGetCurrentContext()];  [UIView se

iOS 视图在不同View之间的切换(对于convertRect:函数的一些理解)

可以通过以下函数完成坐标体系在不同View之间的切换,如下面是完成当前View向ParentView坐标的转换(一个矩阵转换)CGRect parentRect = [currentView convertRect:blankImageView.bounds toView:self.superview]; (self.view 上有viewA 与 viewB 两个视图 btn在viewA上) 绝对rect =[viewA.superView convertRect:btn.frame fromV

iOS 视图:重绘与UIScrollView(内容根据iOS编程编写)

我们继续之前的 Hypnosister 应用,当用户开始触摸的时候,圆形的颜色会改变. 首先,在 JXHypnosisView 头文件中声明一个属性,用来表示圆形的颜色. #import "JXHypnosisView.h" @interface JXHypnosisView () /** 颜色 */ @property (nonatomic,strong) UIColor * circleColor; @end @implementation JXHypnosisView - (in

对于iOS前端框架的理解

iOS前端的架构设计,我所理解的意思就是,使用什么样的模式或者结构敲代码就是各个类怎么协同工作的.或者文件存放的结构.各个类到底如何分工的. 国外有好多关于iOS端的架构的文章,无奈实在英语水平有限,只看了几篇被翻译过的文章.MVC.MVVM.VIPER等还有几个记不住名字的,但是无论什么架构感觉理解的都不是很深刻,具体写代码的时候也没有分的太清楚,也是怎么方便怎么来.最后导致了来回几次的重构,但是重构完成后,过一段时间再看代码的时候还是感觉结构不够清晰,各个类之间的关系比较混乱.现在的项目也是

iOS 视图,动画渲染机制探究

腾讯Bugly特约作者:陈向文 终端的开发,首当其冲的就是视图.动画的渲染,切换等等.用户使用 App 时最直接的体验就是这个界面好不好看,动画炫不炫,滑动流不流畅.UI就是 App 的门面,它的体验伴随着用户使用 App 的整个过程.如果UI失败,用户是不会有打开第二次的欲望的. iOS 为开发者提供了丰富的 Framework(UIKit,Core Animation,Core Graphic,OpenGL 等等)来满足开发从上层到底层各种各样的需求.不得不说苹果很牛逼,很多接口你根本不需要

iOS 视图控制器转场详解

前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标有了大幅度的增长,多谢唐巧前辈的推荐.有些人问我相关的问题,好吧,目前为止就几个,由于没有评论系统,实在不方便交流,但我也没把博客好好整理,一直都在简书上写博客,大家有问题请移步我的简书本文章的页面.关于交流,我想说这么几点: 1.问问题就好,不要加上大神大牛之类的称呼,与本文有关的问题我尽量回答:不负责解析转场动画,看心情回答. 2.去我的简书下留言是最有效的交流方式,要加我好友就