在iPhone开发中,一个应用程序应该只有一个UIWindow的实例,UIWindow在iPhone中是UIView的一个特殊子类,在程序初始化时,通过装载MainWindow.xib或者在代码中创建,它的大小应该就是手机屏幕的大小,并且不应该像普通的UIView一样,设置UIWindow实例——一个特殊的UIView实例——的UIView中的属性。
一个UIView的实例就是一个视图,表示的是屏幕上的一块矩形区域,负责这块矩形区域的描绘以及和用户的交互。
一个UIViewController的实例往往对应一组UIView,这一组UIView的特征是充满一整个屏幕,并且同时出现同时消失,也可以认为一个UIViewController对应的是一个屏幕的界面,来管理这个屏幕的界面的数据,以及这个屏幕的界面所需要做出的对某些事件的相应,如一个屏幕的出现,消失,甚至是屏幕方向的变化等等。一个UIViewController的实例必然对应至少一个UIView实例,而这个UIView的实例应该是一个全屏的视图对象。
UIView进阶参考:http://my.oschina.net/rareliu/blog/24113
windows没有可显示的内容,提供了一个基本的容器container放置views。view定义了一系列你想要显示的内容,view之间可以嵌套显示,即superView,subView
view用来显示内容,一个view控制着应用窗口上的一块矩形区域,主要负责绘制内容,监听事件,管理subView的布局layout
superview property
返回该view的superView
subviews property
返回包含该view的subView的一个数组nsarray,数组中的顺序代表了在屏幕上的显示顺序
window property
返回该view的window,如果没有返回nil
对subView的操作
– addSubview:
添加一个view到该view的subView列表中,位于栈尾,其他view的上面,最先显示。
IMGView *imgView = [[IMGView alloc] initWithFrame:CGRectMake(10, 0, 300, 300)]; [self.view addSubview:imgView]; [imgView release];
addSubview一次,此方法会把你传过去的对象retain一次,那么此时imgView的retainCount为2。self.view变为它的第二个持有者,所以最后要release一次。参考:The receiver retains view. If you use removeFromSuperview to remove view from the view hierarchy, view is released.
– bringSubviewToFront:
把特定的subView移到subView Array的末尾end(最先显示)放到栈的最上面,最先显示
– sendSubviewToBack:
把特定的subView移到subView Array的最开头beginning(最后显示) 放到栈的最下面,最后显示
– removeFromSuperview
把view从superView的subView中删除
– insertSubview:atIndex:
index从0开始,不能大于subViews的count
– insertSubview:aboveSubview:
– insertSubview:belowSubview:
– exchangeSubviewAtIndex:withSubviewAtIndex:
切换两个subView的在栈中的位置
– isDescendantOfView:
用于判断superView
使用方法:BOOL flag = [self.view isDescendantOfView:fatherViewController.view];
setNeedsDisplay和setNeedsLayout使用:
这两个方法与drawRect方法有关,如果不绘制的话不需要关心。
首先两个方法都是异步执行的,而setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。setNeedsDisplay方便绘图,而layoutSubViews方便出来数据,刷新一个UIView的话,调用它的setNeedsDisplay
clipsToBounds BOOL(YES/NO)
决定了子视图的显示局限。具体的说,就是当取值为YES时,剪裁超出父视图局限的子视图项目组;当取值为NO时,不剪裁子视图(超出项目组持续显示,例如在scrollview中。。。)。默认值为NO。
http://blog.csdn.net/newjerryj/article/details/7622044