一个view(视图)是IOS中UIView的子类,标示了屏幕上的一个长方形区域,定义了一个坐标系空间来绘图,并且处理触摸的操作。
view是有层次的,一个view只能有一个superview,但是可以有多个subview。你可以获取一个view,当然返回值是可选的,或者获取一个view的所有subview,返回值是一个数组,虽然这个数组中的元素其实是AnyObject,因为一些历史遗留原因,不过没关系它里面的内容百分百是UIView,你不会获取到别的东西。
另外还有一个东西叫做UIWindow,它是UIView的子类,但是在IOS开发中你不需要关心,在每一个设备的屏幕上都会有一个UIWindow,它在最高层,但你不会向他发送任何消息,你也不跟它交互,你只需要关心UIView就行。
views的层次结构通常不需要使用代码,你可以直接从storyboard中拖拽叠放。你也可以通过代码来创建,有两个方法可以实现,一个是addSubview,另一个是removeFromSuperview。addSubview向预期的superview发送消息,而removeFromSuperview向你需要移除的superView发送消息。
那么view层次结构的顶点或者说是根在哪呢,由于某些历史遗留问题,viewcontroller中有一个属性的名字叫做view,这就是你们在storyboard场景中的最高层次的view。
接下来讲解一下如何初始化一个view。通常的建议是尽可能不要做一个初始化。UIView有两种构造器,代表了两种不同的构造方法。如果你写init(frame:CGRect),参数frame代表父视图中的frame,它是一个坐标系,代表将视图放到这个坐标系中。另一个是使用coder的方式进行初始化,如果你使用storyboard拖拽生成一个视图,那么这个视图是使用init(coder:NSCoder)的方式实现的。
如果要自己的做初始化,推荐的做法是同时实现两个初始化方法,第一个是一个designed的初始化方法,一旦你重写了它你就不能再继承其他designed的初始化方法了。另外还有一个required的初始化方法。然后把需要做的操作写到一个方法中在构造器中调用。这样的做法当且仅当你不得不自己写一个构造器的时候才用到。还有一个初始化的方法就是awakeFromNib如下:
如果你需要在视图展示之前就要操作某些东西的时候使用这个方法,但是只有storyboard中的视图才会调用这个方法.接下来会讲解一下如何在视图中绘制和捕捉用户手势。