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和Bounds

视图的位置和大小可以用两种方式来表示,一种方式是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三个属性是相互关联、相互影响的,其中一个属性发生变化,其他属性也会跟着变化。

Screens, Windows, and Views 创建可视化界面

  • UIScreen object that identifies a physical screen connected to the device.
  • 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

UIScreen对象代表iOS设备的物理屏幕([UIScreen mainScreen])。此屏幕对象建立视图布局边界与像素空间之间的映射。它返回全屏大小(bounds)或只是应用程序占用的矩形(applicationFrame)。

CGrect screenBounds = [ [UIScreen mainScreen] bounds];//返回的是带有状态栏的Rect对于iphone4来说screenBounds=0,0,320,480CGRect viewBounds = [ [UIScreen mainScreen] applicationFrame];//不包含状态栏的Rect对于iphone4来说,viewBounds=0,20,320,460

UIWindow

视图层次的最高层是应用程序窗口,窗口是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

视图是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:方法的调用,其中视图将这些点绘制成线段来创建一个可视屏幕路径。

时间: 2024-10-12 19:55:52

iOS开发之窗口和视图的相关文章

iOS开发——代码生成TabBar与视图切换详解

我在之前多篇博客中讲解了在不使用storyboard而使用nib文件的情况下,使用代码生成导航栏并进行跳转,具体可以参考<iOS开发--界面跳转与返回及视图类型详解><iOS纯代码实现界面建立.跳转.导航栏(无storyboard.无nib)(Objective-C)>.今天我来讲解下在使用nib搭建界面的情况下,用代码生成TabBar,并进行界面之间的跳转.代码示例已经上传至:https://github.com/chenyufeng1991/TabBarTest   . (1)

iOS开发——代码生成TabBar与视图切换具体解释

我在之前多篇博客中解说了在不使用storyboard而使用nib文件的情况下.使用代码生成导航栏并进行跳转,具体能够參考<iOS开发--界面跳转与返回及视图类型具体解释><iOS纯代码实现界面建立.跳转.导航栏(无storyboard.无nib)(Objective-C)>. 今天我来解说下在使用nib搭建界面的情况下,用代码生成TabBar,并进行界面之间的跳转.代码演示样例已经上传至:https://github.com/chenyufeng1991/TabBarTest  

iOS开发之多表视图滑动切换示例(仿&quot;头条&quot;客户端)

好长时间没为大家带来iOS开发干货的东西了,今天给大家分享一个头条新闻客户端各个类别进行切换的一个示例.在Demo中对所需的组件进行的简单封装,在封装的组件中使用的是纯代码的形式,如果想要在项目中进行使用,稍微进行修改即可. 废话少说,先介绍一下功能点,下图是整个Demo的功能点,最上面左边的TabBarButtonItem是用来减少条目的,比如下图有三个按钮,点击减号会减少一个条目.右边的为增加一个条目.点击相应的按钮是切换到对应的表视图上,下方红色的是滑动的指示器,同时支持手势滑动.运行具体

iOS开发初探篇——表视图中的MVC运用

概述 本初探篇为本人学习iOS开发中的一个总结系列,为工作和业余学习中遇到的初级问题的一个初步探究.本文初探的内容是MVC设计模式在表视图中的应用.首先感谢博主KC写的精彩博文. 本文主要内容如下: 1.MVC基本介绍 2.MVC在表视图中的应用 3.总结 MVC基本介绍 MVC模式这个名词太熟悉,不过本人由于缺乏工程实践经验,对其理解目前还停留在理论的表面层次上.在iOS开发中MVC模式第一次在表视图设计中应用到,想借此机会对其有个初步的认识.MVC在表视图中的对号入座,目前的理解为如下图所示

iOS开发之视差滚动视图

首先声明一点,由于自己iOS开发经验有限,这里给下面将要实现的效果起名叫视差滚动视图,自己也不知道是否严谨,等以后有经验了,再来更新吧. 一.需求 有的时候我们可能会有这样一种需求,在一个UITableView的上方放置一个View(为了下面实现方便,这里就叫TopView吧),想要实现的效果是,当滚动UITableView时,让TopView也一起向上滚动:当TopView滚动到一定位置时,不再继续滚动TopView,而只是滚动UITableView. 二.思路 1.开始时的思路是这样的,因为

iOS开发学习之#表视图#(2)添加行

继续上篇学到的删除行,有删除就有添加:添加行我们用 - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 其中(NSArray *)indexPaths用于识别表视图中得行,(UITableViewRowAnimation)animation用来指定动画 核心代码如下: //设置表单元的编辑风格 - (UITableViewCellEditi

iOS开发学习之#表视图#(3)移动行

继续上篇接下来介绍移动行:移动行我们用 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath (UITableView *)tableView用来指定表视图,(NSIndexPath *)sourceIndexPath用来指定要移动行的索引路径,(NSIndexPath

iOS开发学习之#表视图#(4)填充Grouped风格的分组表

直接上代买吧: @implementation ViewController - (void)viewDidLoad { a = [NSArray arrayWithObjects:@"ant",@"alpaca",@"albatross", nil]; b = [NSArray arrayWithObjects:@"badger",@"bat",@"bear", nil]; c = [

iOS开发学习之#表视图#(1)删除行

好久木有写博客了,前面学习的表视图其他内容都木有写,今天就从删除行开始吧,希望自己能够坚持下去..加油(^ω^)..废话少说吧,,,直接上代码: 下面是删除行的核心代码: - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{ if (editingStyle