iOS开发之窗口和视图
视图就是应用程序的界面。视图可以使用nib文件实现,也可以使用代码创建。一个视图也是一个响应器(UIResponder的子类)这意味着一个视图可以与用户交互。因此,视图不只是用户可看到的界面,也是可以和用户交互的界面。
- CGPoint {x,y} 坐标信息 视图所在的坐标信息
- CGSize {width,height} 宽度和高度 视图所在的大小信息
- CGRect {origin,size} CGPoint和CGSize的综合 视图所在的坐标(视图最左上角的点)和大小信息。
- CGPointMake(x,y) 声明位置信息
- CGSizeMake(width,height) 声明大小信息
- CGRectMake(x,y,width,height) 声明位置和大写信息
视图的位置和大小可以用两种方式来表示,一种方式是Frame(框架)、即按照其父视图为起点,得出它自己的位置信息。另一种方式是Bound(边界),即按照它自己为起点,得出其位置。
frame和bounds是UIView中的两个属性(property)。
frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)
-(CGRect)frame{
return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);
}
-(CGRect)bounds{
return CGRectMake(0,0,self.frame.size.width,self.frame.size.height);
}
下图中View B是View A的子视图,那么,View B的frame属性为origin(200,100),size(200,250),而View B的bounds属性为origin(0,0),size(200,250)。
center属性则用CGPoint表示矩形中心点在其父视图中的位置,如上图中View B的center属性为(300,200)。
frame、bounds和center三个属性是相互关联、相互影响的,其中一个属性发生变化,其他属性也会跟着变化。
- A
UIScreen
object that identifies a physical screen connected to the device. - A
UIWindow
object that provides drawing support for the screen. - A set of
UIView
objects to perform the drawing. These objects are attached to the window and draw their contents when the window asks them to.
类的继承关系
UIScreen对象代表iOS设备的物理屏幕([UIScreen mainScreen])。此屏幕对象建立视图布局边界与像素空间之间的映射。它返回全屏大小(bounds)或只是应用程序占用的矩形(applicationFrame)。
CGrect screenBounds = [ [UIScreen mainScreen] bounds];//返回的是带有状态栏的Rect
对于iphone4来说screenBounds=0,0,320,480 CGRect viewBounds = [ [UIScreen mainScreen] applicationFrame];//不包含状态栏的Rect
对于iphone4来说,viewBounds=0,20,320,460
视图层次的最高层是应用程序窗口,窗口是UIWindow的一个实例,UIWindow是UIView的子类 。窗口的主要功能一是提供一个区域显示视图(容器),二是将事件分发给视图。窗口本身不具有任何可见的内容,但它对于应用的视图提供一个基本的窗口。应用程序应该只有一个主窗口,它占据整个屏幕形成背景,并是所有可见视图的超视图,其他视图就是它的子视图。
窗口是项目的主nib文件中的一个顶层nib对象。在应用程序运行时,系统自动装载该nib文件,窗口被实例化。主nib文件中的另一个顶层的nib对象是应用程序委托(delegate),它有一个window输出口(outlet)指向这个窗口。当程序运行时,系统生成该应用程序委托的一个实例。它的window属性指向窗口。
通常我们可以采取两种方法将view添加到UIWindow中:
1、addSubview
直接将view通过addSubview方式添加到window中,程序负责维护view的生命周期以及刷新,但是并不会为去理会view对应的ViewController,因此采用这种方法将view添加到window以后,我们还要保持view对应的ViewController的有效性,不能过早释放。
2、rootViewController
rootViewController是UIWindow的一个遍历方法,通过设置该属性为要添加view对应的ViewController,UIWindow将会自动将其view添加到当前window中,同时负责ViewController和view的生命周期的维护,防止其过早释放
UIWindow在显示的时候会根据UIWindowLevel进行排序的,即Level高的将排在所有Level比他低的层级的前面。下面我们来看UIWindowLevel的定义:
typedef CGFloat UIWindowLevel; UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar;
iOS系统中定义了三个window层级,其中每一个层级又可以分好多子层级(从UIWindow的头文件中可以看到成员变量CGFloat _windowSublevel;),不过系统并没有把则个属性开出来。UIWindow的默认级别是UIWindowLevelNormal。UIWindowLevelNormal<UIWindowLevelStatusBar<UIWindowLevelAlert.
视图是UIView类的实例,负责在屏幕上定义一个矩形区域。在iPhone的应用程序中,视图在展示用户界面及响应用户界面交互方面发挥关键作用。每个视图对象都要负责渲染 视图矩形区域中的内容,并响应该区域中发生的触碰事件。这一双重行为意味着视图是应用程序与用户交互的重要机制。在一个基于模型-视图-控制器的应用程序中,视图对象明显属于视图部分。
UIView有一个超视图(superview)属性和一个子视图(subviews)属性。subviews是一个UIViews的NSArray,按照由后往前的顺序放置。这有助于在代码中访问视图层次结构。isDescendantOfView方法可以判断一个视图是否是另一个视图的子视图。
UIView提供了很多建立和管理视图的方法。
1、添加视图
- insertSubview:atIndex: //放在子视图数组的具体索引位置
- insertSubview:aboveSubview: //某个子视图前面
- insertSubview:aboveSubview: //某个子视图前面
2、重新排序和删除子视图
- [parentView exchangeSubviewAtIndex:i withSubviewAtIndex:j]//交换两个视图的位置
- bringSubviewToFront:和sendSubviewToBack://将子视图提前活置后
- [childView removeSuperview]//删除某个视图的子视图
3、视图回调
某个视图的层次一改变,该视图就会收到一次回调。
- a、调用addSubivew:成功后会给该视图发送didAddSubivew:回调,触发UIView的子类在心增视图时执行其他操作。
- b、didMoveToSuperview:会通知相关视图他们的上级视图已经变化。
- c、视图移动前会发出willMoveToSuperview:回调
- d、didMoveToWindow:回调和didMoveToSuperview:相似,从命名上能看出其区别。
- e、willMoveToWindow:在视图移动前发出的回调。
- f、willRemoveToSubview:回调通知父视图子视图即将被删除
UIView掌管直接屏幕绘图。他的drawRect:方法提供一种低级方式来直接绘制内容,允许使用Quartz 2D调用创建和显示任意元素,可将这两个元素结合起来共同构建具体、可操作的界面。
当用户触摸屏幕时,Touchview类收集一系列点,在每个触摸移动之处,touchesMoved:WithEvent:方法调用setNeedsDisplay。这又会触发对drawRect:方法的调用,其中视图将这些点绘制成线段来创建一个可视屏幕路径。
iOS开发之窗口和视图的更多相关文章
- iOS开发之多表视图滑动切换示例(仿"头条"客户端)---优化篇
前几天发布了一篇iOS开发之多表视图滑动切换示例(仿"头条"客户端)的博客,之所以写这篇博客,是因为一位iOS初学者提了一个问题,简单的写了个demo做了个示范,让其在基础上做扩展 ...
- iOS开发——代码生成TabBar与视图切换具体解释
我在之前多篇博客中解说了在不使用storyboard而使用nib文件的情况下.使用代码生成导航栏并进行跳转,具体能够參考<iOS开发--界面跳转与返回及视图类型具体解释><iOS纯代 ...
- iOS开发之视差滚动视图
首先声明一点,由于自己iOS开发经验有限,这里给下面将要实现的效果起名叫视差滚动视图,自己也不知道是否严谨,等以后有经验了,再来更新吧. 一.需求 有的时候我们可能会有这样一种需求,在一个UITabl ...
- iOS开发 自定义窗口 以及 点击scrollView置顶
static UIWindow *topWindow_; static UIScrollView *scrollView_; /** * 显示顶部窗口 */ + (void)show { dispat ...
- iOS开发如何在一个透明视图上添加不透明的子控件
相信很多同学都会遇到过这个问题, 当我们弹出一个半透明的遮盖层时, 又想在遮盖层上加一些子视图, 这个时候如果你的遮盖层设置了alpha属性, 你会惊讶的发现, 加载遮盖层上的所有子控件都是透明了, ...
- iOS开发系列--视图切换
概述 在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单.在iOS开发中常用的视图切换有三种,今天我们将一一介绍: UITabBarController ...
- iOS开发入门教程
iOS开发入门教程 http://my.oschina.net/mailzwj/blog/133273 摘要 iOS开发入门教程,从创建项目到运行项目,包括OC基础,调试,模拟器设置等相关知识. iO ...
- IOS开发入门教程-总结篇-写给狂热的编程爱好者们
程序发轻狂,代码阑珊,苹果开发安卓狂!--写给狂热的编程爱好者们 写在前面的话 学习iOS应用程序开发已有一段时间,最近稍微闲下来了,正好也想记录一下前阶段的整个学习过程.索性就从最基础的开始,一步一 ...
- 我的iOS开发系列博文
之前目录性的总结了发表过的关于OC方面的文章,今天在目录性的总结一下有关iOS开发的文章.走过路过不要错过哦,今天的博文也全都是干货.写技术博客与大家交流一下思想也是不错的. 下面是我的技术博客中有关 ...
随机推荐
- linux man使用方法 和centos安装中文man包 --转
http://blog.chinaunix.net/uid-25100840-id-302308.html 这两天学习<linux设备驱动程序开发详解>中的异步通知,其中有一个fcntl( ...
- 如何编写自己的Linux安全检查脚本?
因为本人工作中要涉及到很多东西,审计(日志.数据神马的).源代码审计.渗透测试.开发一大堆东西,有些东西,越是深入去做,越会发现,没有工具或脚本,工作起来是有多么的坑. 工作的这段时间,自己写了几个工 ...
- CentOS7 安装Docker报错
安装报错: Transaction check error: file /usr/lib/systemd/system/blk-availability.service from install o ...
- 基于xml的用户注册登录案例
用户注册登录 要求:3层框架,使用验证码 1 功能分析 l 注册 l 登录 1.1 JSP页面 l regist.jsp 注册表单:用户输入注册信息: 回显错误信息:当注册失败时, ...
- 数据结构【三】:简单优先队列PriorityQueue
在数据结构[二]:简单阻塞队列BlockingQueue的基础上添加权限属性:priority,并控制enqueue时根据priority排序插入. 1.定义priority取值范围0~9 2.deq ...
- 搭建第一个web项目:jasperReports+ireport制作pdf报表
一:jasperReports介绍: 在web应用中,必须面临大量的报表问题,即将数据库中的数据形成报表并进行打印.传统开发只能使用html页面设计报表,效率低且不支持别的格式.所以jasperRep ...
- 看完final的感受
今天没课,(其实是有体育课的,去打了一会球就跑路了...)就在宿舍看world final ; 我去,老毛子真是好厉害,看的我目瞪口呆,哈喇子直流; 上交的大神好厉害,本来还以为上交要夺冠的,最后罚时 ...
- SPOJ 7758. Growing Strings AC自动机DP
Growing Strings 题目:给出n个字符串,问最多能够选出多少个串组成序列,并满足前一个字符串是后一个字符串的子串. 分析: AC自动机经典水题... 考虑每个节点结尾时,他能够选出最多的串 ...
- hdu 3308 LCIS 线段树
昨天热身赛的简单版:LCIS.昨天那题用树链剖分,不知道哪里写错了,所以水了水这题看看合并.更新方式是否正确,发现没错啊.看来应该是在树链剖分求lca时写错了... 题目:给出n个数,有两种操作: 1 ...
- symbol(s) not found for architecture x86_64
项目报错如下: ld: warning: ignoring file /xxxx/xxxx/ZBarSDK/libzbar.a ld: symbol(s) not found for architec ...