iOS–UIView(1)

最近看了官方文档中关于UIView的内容,记录一下所学的内容。关于UIView的内容来自iOS 9.0 Documentation—UIKitReference—UIView Class Reference。

UIView

UIView继承自UIResponder:NSObject,遵循的协议有UIDynamicItem, UIAppearanceContainer, UIAppearance, UICoordinateSpace, NSObject, NSCoding, UITraitEnvironment。

UIView类在屏幕中定义了一块矩形区域及其中的界面,并管理负责界面的内容。View对象作为App与用户的主要交互途径,其有着许多的职责。

  • 界面绘制及动画
    • view通过例如UIKit,Core Graphics和OpenGL ES等技术在矩形区域中绘制界面内容。
    • 某些view的properties可以动画的改变。
  • 布局及subview的管理
    • 一个view包含着0至多个subview
    • 每个view都定义了自己默认的相对于superview的大小改变方式
    • 如果需要可以一个view可以定义其subview的大小和位置
  • 事件处理
    • view是一个响应者并可以处理touch event以及其他所有UIResponder类事件。
    • view可以通过addGestureRecongnizer:方法来添加常见的手势处理

frame, bounds, center

一个view的外形由frame,bounds和center这三个属性共同定义。

frame在view的 superview的坐标系 中定义了自己的原点和大小。frame通常运用于调整view的大小和位置。

@property(nonatomic) CGRect frame

可见frame实际上是一个CGRect结构体,CGRect又是由CGPoint和CGSize这两个结构体组成,两者分别定义了原点的坐标和大小的宽高。frame中的size和bounds中的是同一个CGSize,frame中的point和center中的也是同样的CGPoint,改变frame中对应的属性也会改变bounds或center中相应的属性。

struct CGRect { CGPoint origin; CGSize size; };
typedef struct CGRect CGRect;

struct CGPoint { CGFloat x; CGFloat y; };
typedef struct CGPoint CGPoint;

struct CGSize { CGFloat width; CGFloat height; };
typedef struct CGSize CGSize;

与frame不同的是bounds描述的是 view自身坐标系 中view的坐标和大小。bounds通常仅运用在自定义绘图代码中。一般情况下bounds中的原点为(0, 0),即以自身矩形左上角的点为坐标原点,也可以通过改变原点的坐标来显示view的不同部分。

@property(nonatomic) CGRect bounds

center在view的 superview的坐标系 中定义了自己的中心点,通过改变center属性可在不改变view的大小情况下改变view的位置。

@property(nonatomic) CGPoint center

添加subview的相关方法

最为常用的就是addSubview:方法,在view中添加一个子view

- (void)addSubview:(UIView *)view

还可以使用insertSubview:aboveSubview:和insertSubview:belowSubview:以及exchangeSubviewAtIndex:withSubviewAtIndex:方法来控制subview的层级关系。前两个方法看方法名就知道用法。而第三个方法中

- (void)exchangeSubviewAtIndex:(NSInteger)index1
            withSubviewAtIndex:(NSInteger)index2

每个index代表着subview在其view的数组中相应的位置,index从0开始并且不大于subview的个数。这个方法只能操作在同一subview层级下的view。

线程相关

只能在主线程中对view对象进行操作。

Tags: ,

Updated: