View和Window的架构

来源:互联网 发布:知乎 英法百年战争 编辑:程序博客网 时间:2024/06/17 07:07
1.概述
    在iOS中,你能用windows和view将你应用的内容装配到屏幕上,windows本身它不提供任何可见的内容,但是它特供对于你应用view的一个基本的容器,view定义了你想要填充一些内容到窗口的一部分,你可能要显示一些图片,文本,形状,或者其他的一些混合体,另外,你能够用view去组织和管理其他view。  
    每一个应用至少有一个window和一个view来装配内容,UIKit和其他的系统框架提供了一些预定义的view,能够使你装配内容,这些view的范围从简单的button到text label再到更复杂的,如table view, picker view,还有scroll view等,如果这些预定义的view不能满足你的需要,你能另外自定义view和管理drawing和event执行。
    View和window会装配你应用的界面,是你用户与应用交互的借口,UIKit和其他的系统框架提供了大量的view,你能使用原有的,或者少量修改的,无论你使用系统的view或者你自己创建的view,你需要理解UIView和UIWindow类的架构,这些类提供了对View布局和装配的精确管理,理解这些对于当你应用改变发生时,确保你的view可能的行为有很大的帮助。

2.View的基本架构
    你可能想做大多数视觉上的事情是通过UIView类的实例对象来完成,一个view对象定义了在你屏幕上的一个方形区域,在这个区域上可以执行画图和触摸事件。一个view能够充当做为其他view的父view ,和协调这些view的位置的大小,UIView类大多数的工作是管理两个view之间的关系,但是在你需要的情况的,你能够另外定义默认的行为。
    View与Core Animation层结合工作去执行view内容的渲染和一些动画的操作,每一个在UIKit的View都被一个层对象支持(通常是CALayer类实例的对象),他们管理这view和执行view切换间动画的幕后的存储工作,大多数操作你应该通过UIView接口,然而,在一些状况下,你需要对你的view的渲染或者动画的行为有更多的控制,你能够通过层替换来执行这些操作。
    对于理解view和layer之间的关系,下边的图例子能够帮助你理解,在下边这个application中包含了一个window,生成了一个UIVIew的对象作为一个view的容器,一个image view,一个toobar用于控制,和一个bar button的元素,每一个view都有一个能够被view layer属性访问的层对象,在这些layer对象是Core Animation渲染对象和最终在硬件上固定和管理在屏幕上实际像素的大小。
    Core Animation layer对象的使用对于性能来说可能很重要。一个view对象的实际drawing代码尽可能少的被调用,并且当代码被调用时,结果被Core Animation缓存,以便以后尽可能的重用,重用已经渲染的内容防止通常需要更新view昂贵的绘画周期,在动画期间,这个内容的重用也是尤其重要的,现有的内容被操纵,以便减少创建新的内容的昂贵代价。

3.View的绘画周期
    UIView类对于装配内容用了一个随需应变的drawing model,当一个view首次出现在屏幕上石化,系统要求它draw他们的内容。系统捕获这个内容的片段,并且用这个片段作为view的蓄念的表现,如果你从来都没有改变view的内从,view的drawing代码可能从来不会再次被调用,对于执行view的更多操作,快照是被重用的,如果你改变了内容,你将会通知系统view已经被改变,然后view重复drawing的执行,并且捕获一个新的快照。
    当你的view内容改变时,你不需要重新绘制那些改变,取而代之的时,你能够调用setNeedsDisplay或者setNeedsDisplayInRect方法来表明这个view无效,这些方法会通知系统,view的内容被改变了,并且需要在合适的时间重新绘制,系统会一直等待,直到初始化任何drawing的操作之前,当前的run loop已经结束,这会依赖给你的销毁多个view的机会,添加或者移除view从你的组合体系中,隐藏View, 重新设置view的size,和重新定位view。你做的这些改变,将会在同一时刻被反映到应用中去。

注意:改变一个view的几何形状不会自动引起系统重画view的内容,view的contentMode属性确定怎样改变view的几何图形,大多数内容模式的延伸和定位快照是存在view的边界内,并不是创建一个新的。

    当到时候来渲染你的vidw的内容,实际的drawing处理在view和配置的各种依赖,系统view通常的方式是实现私有的drawing方法去渲染他们的内容,那些想通系统的view,经常留出接口,你能通过接口配置view实际的出现方式,对于自定义UIView的子类,你通常需要重写drawRect方法,你的view的这个方法draw你的view的内容这还提供一个view内容的其他方式,例如直接设置位于层之下的内容,但是重写drawRect方法是最通用的技术。

4内容模型
    每一个view都有一个内容模型,来控制view重新利用它在view的几何图形和它重用的它的所有内容,当一个view第一次显示时,它会像往常一样渲染它的内容,结果会被捕获在一个位图之下,在这之后,改变view的几何不总是引起位图的重新创建,取而代之的时,在contentMode属性的值来确定位图是否应该缩放以适应新的边界,或者只是固定在view的一个角落或者边缘。
每当你做下列的事情时,一个view的内容模型就会被应用:
    1.改变view fram或者边界长方形的款或者高
    2.分配一个包括视图的转换因子的转换
    默认情况下,contentMode属性对于大多数view是设置到UIViewContentModeScaleTofill,会引起view的内容被缩放或者扩张去填充到新的frame的size,下图的结果展现除了一些内容模型改变的结果,你可以看图的格式,在view的边界被完全填充不是所有内容的模型,那些可能使view的内容失真。


   内容模型有益于你的view的内容重新利用,当你特别想要自定义你的view在他们缩放或者改变size的期期间来redraw他们自己,你可以另外通过设置UIViewContentModeRedraw的值来设置内容模型完成这个操作,设置你的view的内容值,来强制系统调用你的drawRect方法来响应几何图形的改变,在通常的情况下,你应该尽可能的避免使用这个值,并且不应该使用它与标准系统的视图。

5.可伸缩的视图
    你可以指定一个视图的一部分能够可伸缩,以至于当你view的大小改变时,仅有可伸缩的那部分被影响,你通常用对于button或者其他的view用可伸缩区域,可伸缩的区域延伸沿一个或两个轴的观点,当然,当你沿着两个区域伸缩一个view时,view的边必须定义一个可重用的模式,以免任何失真,下图展示给你一个view明显的失真,view的每一个颜色的区域像素复制来填补相应的地区更大的view.


    你能通过contentStretch属性指定一个view的可伸缩的区域,这个属性接受一个0.0到1.0正常范围的矩形值,当伸缩view时,系统会变化定义在可伸缩的区间,而不会去改变非可伸缩的区域,在你视图的改变中,你需要实时更新contentStretch属性的值。
    View的内容模式在决定如何使用视图的可伸缩的区域中也扮演了重要的角色,可伸缩的区域仅用于当内容改变时,引起的view内内容改变,这意味着可伸缩的view仅能被UIViewContentModeScaleTofil、UIViewContentModeScaleAspectFit、UIViewContentModeScaleAspectFill内容所用,如果你指定一个pins的内容到一个边或者一个角,view将会忽略可伸缩的区域
注意:当UIImage对象被指定一个view作为一个背景时,contentStretch的属性是被推荐使用的,可伸缩的view执行完全在Core Animation层被执行,因为这会提高性能。


0 0
原创粉丝点击