Views概念总结

Views的主要作用:

  • 子视图的排版和管理

  • 绘图和动画Drawing and animation

  • 处理触摸事件Event handling


创建和配置视图

1.通常创建一个nib文件来保存某个视图控制器的整个视图层次,nib文件的根视图表示视图控制器的视图
2.视图的默认初始化方法为initWithFrame,指定了视图的大小和在父视图中的位置。
3.视图必须要添加到window中才能显示,或者添加为某个window中的视图的子视图
[plain] view plain copy print ?
  1. <span style="font-size:16px;">CGRect  viewRect = CGRectMake(0, 0, 100, 100);  
  2. UIView* myView = [[UIView alloc] initWithFrame:viewRect];</span>  

设置视图的属性

alpha,hidden,opaque 前两者直接改变视图的透明度,opaque告诉系统视图是否透明
bounds,center,frame,transform 这些属性影响视图的大小和位置,bounds定义了在视图自身坐标系中的可视化区域。transform用来实现旋转和缩放
                  当transform不是identity transform时, frame无效.

autoresizingMask,autoresizesSubviews 第一个属性定义视图如何根据父视图的bounds改变自身大小位置,第二个属性指定是否需要改变子视图

gestureRecognizers,  userInteractionEnabled,  multipleTouchEnabled, exclusiveTouch
第一个属性表示添加到当前视图的gesture recognizer
第二个属性表示视图是否要响应事件,如果设置为no,则用户事件被丢弃
第三个属性如果设置为no,则视图只响应多触摸事件序列的第一个事件,此时window中的其他视图仍然可以响应事件
第四个属性如果设置为yes,视图阻止触摸事件传递给其他的视图

contentMode, contentStretch, contentScaleFactor  
前两个属性用于指定视图内容如何根据视图的大小改变而改变。
[plain] view plain copy print ?
  1. <span style="font-size:16px;">typedef enum {  
  2.    UIViewContentModeScaleToFill,  
  3.    UIViewContentModeScaleAspectFit,  
  4.    UIViewContentModeScaleAspectFill,  
  5.    UIViewContentModeRedraw,  
  6.    UIViewContentModeCenter,  
  7.    UIViewContentModeTop,  
  8.    UIViewContentModeBottom,  
  9.    UIViewContentModeLeft,  
  10.    UIViewContentModeRight,  
  11.    UIViewContentModeTopLeft,  
  12.    UIViewContentModeTopRight,  
  13.    UIViewContentModeBottomLeft,  
  14.    UIViewContentModeBottomRight,  
  15. } UIViewContentMode;</span>  

backgroundColor, subviews, drawRect:, layer
第一个属性用来改变视图的背景色
第二个属性而只读的数组,包含了已添加到视图的子视图
第三个方法用于自定义绘制视图内容,当需要绘制视图内容时重载

Tagging Views
视图类包含一个tag属性,你可以给每个视图对象指定一个整数值。你可以通过该值在运行时查找视图。tag的默认值为0
使用viewWithTag:方法来查找视图

创建和管理视图层次

Views概念总结_第1张图片
添加和删除子视图

1.如果你通过代码创建视图,使用一下方法

  • 使用addSubview:方法添加子视图,子视图被添加到子视图数组的最后.

  • 插入子视图使用insertSubview

  • 改变子视图的顺序使用 bringSubviewToFront:sendSubviewToBack:, or exchangeSubviewAtIndex:withSubviewAtIndex: 

  • 移除子视图调用removeFromSuperview方法

2.当你添加子视图的时候,子视图的frame属性表示其在父视图中的大小和位置。子视图位于父视图之外的部分不会被自动剪裁,需要设置父视图的clipsToBounds属性为YES

3.父视图自动retain子视图,当子视图被添加到父视图后就可以安全释放。removeFromSuperview方法在移除之前自动释放子视图

4.当你添加子视图时,UIKit会通知子视图和父视图

willMoveToSuperview:willMoveToWindow:willRemoveSubview:,didAddSubview:didMoveToSuperview, or didMoveToWindow

5.superView表示接收者的父视图,window表示包含接收者的window。因为根视图没有父视图,其superview属性为nil,通常window为视图层次的根视图

6.你可以通过设置hidden属性为YES,或者将alpha设置为0来隐藏视图,被隐藏的视图不会接受触摸事件,但是要参与autoresizing和其他的排版。如果一个视图为first responder,那么隐藏之前应该resign。如果要使用动画隐藏视图,那么修改alpha属性


在视图层次中定位视图

1.有两种方法来定位视图

  • 在合适位置存贮相关视图的指针.

  • 给视图添加tap,使用viewWithTag方法来获取视图

视图的变换,缩放,旋转

1.UIView的transform属性包含了一个CGAffineTransform结构,这个属性默认设置为identity transform,这个值不会改变视图外观
2.当视图应用多个变换时,给CGAffineTransform赋值的顺序决定了变换的顺序,每个变换取决与视图的中心点
[plain] view plain copy print ?
  1. <span style="font-size:16px;">// M_PI/4.0 is one quarter of a half circle, or 45 degrees.  
  2. CGAffineTransform xform = CGAffineTransformMakeRotation(M_PI/4.0);  
  3. self.view.transform = xform;</span>  

视图层次中的坐标变换

1.触摸事件中包含的在window坐标系中发生的位置,可以使用UIView的方法来进行转换

  • convertPoint:fromView:

  • convertRect:fromView:

  • convertPoint:toView:

  • convertRect:toView:

2.除了UIView的方法,你也可以使用UIWindow类的方法进行转换

  • convertPoint:fromWindow:

  • convertRect:fromWindow:

  • convertPoint:toWindow:

  • convertRect:toWindow:


在运行时修改视图

1.当视图的大小变化时,其子视图的大小和位置均发生变化
2.父视图的autoresizesSubviews属性决定是否要改变子视图大小,如果设置为YES,那么父视图根据子视图的autoresizingMask属性来改变子视图

自定义视图

1.创建自定义视图的清单

  • 定义合适的初始化方法:

    • 对于通过代码创建的视图,重载initWithFrame: 方法或创建自定义初始化方法

    • 对于通过nib文件载入的视图,重载 initWithCoder: 方法.

  • 实现dealloc方法来管理自定义的数据

  • 重载drawRect来管理自定义绘制

  • 设置 autoresizingMask 属性来定义视图的autoresizing behavior.

  • 如果你的视图对象管理多个子视图:

    • 在视图的初始化过程中创建子视图,并设置其 autoresizingMask 属性

    • 如果你的子视图需要自定义排版,重载 layoutSubviews 方法并实现你的排版代码.

  • 管理触摸事件:

    • 通过 addGestureRecognizer: 方法添加手势.

    • 或者直接处理触摸事件,重载 touchesBegan:withEvent:touchesMoved:withEvent:,touchesEnded:withEvent:, and touchesCancelled:withEvent: methods. (无论你处理什么触摸事件,总是应该重载touchesCancelled:withEvent: 方法)

初始化视图

1.使用代码创建视图时,重载initWithFrame方法

[plain] view plain copy print ?
  1. - (id)initWithFrame:(CGRect)aRect {  
  2.     self = [super initWithFrame:aRect];  
  3.     if (self) {  
  4.           // setup the initial properties of the view  
  5.           ...  
  6.        }  
  7.     return self;  
  8. }  

2.如果你是从nib文件中创建视图,那么nib载入代码会调用initWithCoder方法,此时重载此方法来初始化。你同样可以使用awakeFromNib方法来添加其他的初始化信息

实现绘制代码

1.重载drawRect方法来绘制视图内容

2.在你条用此方法之前,UIKit会配置一个基本的绘图环境给视图。

[plain] view plain copy print ?
  1. Listing 3-5  A drawing method  
  2. - (void)drawRect:(CGRect)rect {  
  3.     CGContextRef context = UIGraphicsGetCurrentContext();  
  4.     CGRect    myFrame = self.bounds;  
  5.    
  6.     // Set the line width to 10 and inset the rectangle by  
  7.     // 5 pixels on all sides to compensate for the wider line.  
  8.     CGContextSetLineWidth(context, 10);  
  9.     CGRectInset(myFrame, 5, 5);  
  10.    
  11.     [[UIColor redColor] set];  
  12.     UIRectFrame(myFrame);  
  13. }  

响应事件


1.视图类是responder类的子类,能够接受触摸事件。当触摸事件发生时,window将该事件发送到视图中

2.视图可以使用 gesture recognizers to detect taps, swipes, pinches, and other types of common touch-related gestures

3.如果需要直接处理事件,则重载一下方法

  • touchesBegan:withEvent:

  • touchesMoved:withEvent:

  • touchesEnded:withEvent:

  • touchesCancelled:withEvent:

4.视图默认一次只响应一个触摸,如果你希望追踪多手势,需要指定视图的multipleTouchEnabled属性为YES

5.一些视图,lable和image视图,默认禁止处理触摸事件,如果需要处理触摸事件,设置userInteractionEnabled

6.UIView的动画方法通常在动画进行的过程中禁止触摸事件


原文

你可能感兴趣的:(Views概念总结)