首页 > 代码库 > UIView

UIView

+ (Class)layerClass;                        
每个UIView对象都有一个隐式层(underlying layer),即一个 CALayer对象。该方法返回隐式层所属的类。通常为CALayer类型。不建议创建CALayer的子类,如确实需要CALayer子类。需实现该方法,并返回子类的class。

 

- (id)initWithFrame:(CGRect)frame;

默认的初始化方法。

 

@property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteractionEnabled; 

可以通过[self isUserInteractionEnabled];获取 userInteractionEnabled的值。

默认为yes,表示可以响应事件。设置为no,表示把对象移出响应链,对象不能接受事件,交给下一响应对象。

 

@property(nonatomic)  NSInteger tag;

视图的一个标志。

ps:中介者模式中,可以根据小按钮的tag值来开启/关闭响应的视图。

 

@property(nonatomic,readonly,retain)   CALayer  *layer;             

每个UIView对象都有一个隐式层,该属性指向隐式层。

----------------------------------------------------------<UIViewGeometry>------------------------------------------------------

@property(nonatomic) CGRect            frame;

相对坐标,origin的值是相对于父视图(bounds)而言的。

@property(nonatomic) CGRect            bounds;

默认origin的值为0,以视图本身为原点,size和frame相同。
@property(nonatomic) CGPoint           center; 

相对于父类的中心点。

 

@property(nonatomic) CGAffineTransform transform;  

仿射变换,用来对视图进行2D的转换,如(平移,旋转,缩放)。

比较庆幸的是,使用这个属性并不需要熟悉的理解仿射变换这个数学概念,因为CoreGraphics.framework里的CGAffineTransform.h对几种常用变换进行了封装,可以直接调用。

例如:

image.transform =  CGAffineTransformMakeRotation(M_PI);

可使image视图旋转180度。

另,高级的3d旋转,请参见核心动画。


@property(nonatomic) CGFloat           contentScaleFactor 

据说是“修改contentScaleFactor可以让UIView的渲染精度提高”

实际测试,UIImageView的这个属性值越小,image就被放的越大。


@property(nonatomic,getter=isMultipleTouchEnabled) BOOL multipleTouchEnabled; 

默认不实现多点触控,设置为yes开启多点触控。


@property(nonatomic,getter=isExclusiveTouch) BOOL       exclusiveTouch;

独占touch事件。视图成为第一响应对象后,得等全部手指离开,否则别的视图不会接受touch事件。(手指不受此影响)


- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;   // recursively calls -pointInside:withEvent:. point is in the receiver‘s coordinate system
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;   // default returns YES if point is in bounds

关于这几个方法,没有比这篇文章更好的介绍了。

链接如下:

hitTest:withEvent:方法流程


- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;

把本地视图(调用者)下的point(第一参数)转换为指定view(第二参数)的point(返回值);
- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;

把指定view(第二参数)下的point(第一参数)转化为本地视图(调用者)的point(返回值);


- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;
- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;

道理同上。

@property(nonatomic) BOOL               autoresizesSubviews; 

是否开启子视图自动布局。默认返回yes,返回no关闭自动布局。

 

@property(nonatomic) UIViewAutoresizing autoresizingMask;   

该属性相对于是父视图而言,即设置该属性并不会影响该视图的子视图。

固,想要设置某个子视图的自动布局,需要修改子视图的UIViewAutoresizing属性。

该属性为枚举类型。具体内容如下:

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

UIViewAutoresizingNone :这个常量如果被设置,视图将不进行自动尺寸调整。

UIViewAutoresizingFlexibleHeight这个常量如果被设置,视图的高度将和父视图的高度一起成比例变化。否则,视图的高度将保持不变。
UIViewAutoresizingFlexibleWidth这个常量如果被设置,视图的宽度将和父视图的宽度一起成比例变化。否则,视图的宽度将保持不变。

UIViewAutoresizingFlexibleLeftMargin这个常量如果被设置,视图的左边界将随着父视图宽度的变化而按比例进行调整。否则,视图和其父视图的左边界的相对位置将保持不变。

UIViewAutoresizingFlexibleRightMargin这个常量如果被设置,视图的右边界将随着父视图宽度的变化而按比例进行调整。否则,视图和其父视图的右边界的相对位置将保持不变。

UIViewAutoresizingFlexibleBottomMargin这个常量如果被设置,视图的底边界将随着父视图高度的变化而按比例进行调整。否则,视图和其父视图的底边界的相对位置将保持不变。

UIViewAutoresizingFlexibleTopMargin这个常量如果被设置,视图的上边界将随着父视图高度的变化而按比例进行调整。否则,视图和其父视图的上边界的相对位置将保持不变。

该图很直观的表达了枚举的用法

 

 

- (CGSize)sizeThatFits:(CGSize)size;    

返回最佳尺寸,默认返回self.frame.size。

可以把指定的求最佳尺寸的算法写进该方法,并调用- (void)sizeToFit;  来调该方法。

例如,lable可以用把自文字长度作为返回值,来修改lable的长度。
- (void)sizeToFit;           

会调用- (CGSize)sizeThatFits:(CGSize)size;   方法。

-----------------------------------------------------<UIViewHierarchy>---------------------------------------------

@property(nonatomic,readonly) UIView       *superview;

指向父视图。
@property(nonatomic,readonly,copy) NSArray *subviews;

存放子视图。
@property(nonatomic,readonly) UIWindow     *window;

指向当前窗口。可以用来判断视图是否在窗体中,不在返回nil;

- (void)removeFromSuperview;

从父视图中移出。
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;

插入子视图到指定的位置。(就是subviews数组)。
- (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2;
交换指定位置的两个视图。

- (void)addSubview:(UIView *)view;

插入子视图。比较常用。
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;

在siblingSubview下插入视图。

- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;

在siblingSubview上插入视图。
- (void)bringSubviewToFront:(UIView *)view;

把视图放到最前。
- (void)sendSubviewToBack:(UIView *)view;
把视图放到最后。

ps:子视图本来是并列的关系,那么这个前后关系是什么意思呢?按index插入又有什么意义呢?

答案是,自视图的前后关系体现在显示上,当frame重叠的时候,“前面”的视图会覆盖住“后面”的视图,代码里这个关系表现为,subviews[1]在subviews[0]前面,subviews[0]被subviews[1]覆盖。



- (void)didAddSubview:(UIView *)subview;
- (void)willRemoveSubview:(UIView *)subview;
- (void)willMoveToSuperview:(UIView *)newSuperview;
- (void)didMoveToSuperview;
- (void)willMoveToWindow:(UIWindow *)newWindow;
- (void)didMoveToWindow;
以上方法都会在指定的事件(方法名)发生时被UIKit框架调用。。。

可以通过实现这几个方法,在事件发生的时候执行自己的代码。。。

- (BOOL)isDescendantOfView:(UIView *)view;  

是否为某视图的后裔(就是子视图的子视图.......)自己做参数,返回yes。


- (UIView *)viewWithTag:(NSInteger)tag;     // recursive search. includes self

查找指定tag的view。

// Allows you to perform layout before the drawing cycle happens. -layoutIfNeeded forces layout early
- (void)setNeedsLayout;

标记视图需要重新布局,会调用layoutSubviews。
- (void)layoutIfNeeded;

看了下外国的博客,大体意思是,有时候,当调用了并不会马上调用layoutSubviews,这时候调用该方法,可以强制发生重新布局。
- (void)layoutSubviews;   

子视图布局。

需要子类去实现这个方法。

很多地方会调用这个方法。

-----------------------------------------------------------<UIViewRendering>------------



- (void)drawRect:(CGRect)rect;

重绘。在里定制代码。

- (void)setNeedsDisplay;
- (void)setNeedsDisplayInRect:(CGRect)rect;
调用重绘。

可以参考这篇文章,写的不错。

Phone重绘机制drawRect

@property(nonatomic)                 BOOL              clipsToBounds; 

默认返回no,表示视图不会被边框剪切,如果希望视图被边框剪切。可以返回yes;             
@property(nonatomic,copy)            UIColor          *backgroundColor; 

背景颜色。
@property(nonatomic)                 CGFloat           alpha;

 透明度。在0到1之间,0表示完全透明,1表示完全不透明。透明后移出响应链。
@property(nonatomic,getter=isOpaque) BOOL              opaque;

算是一个开关,不准备透明,就用默认值“yes”,会开启系统的优化,提高性能。设置为no,则不会开启优化。

另外, opaque为no的时候,alpha应该设置为1.0。否则结果未定义。

@property(nonatomic)                 BOOL              clearsContextBeforeDrawing; 

是否在画图前清除绘图上下文。默认是清除。

在滚动的时候,会进行大量清除操作,会影响效率。一般设置为no;

@property(nonatomic,getter=isHidden) BOOL              hidden; 

是否隐藏,默认不隐藏返回no,返回yes表示隐藏,不接受事件,不显示。

@property(nonatomic)                 UIViewContentMode contentMode;  

感觉这个属性多用在UIImageView里,有几种显示方式,需不需要拉伸,或填充,自行判断。
@property(nonatomic)                 CGRect            contentStretch NS_DEPRECATED_IOS(3_0,6_0); 

6.0被废弃。建议用这个 -[UIImage resizableImageWithCapInsets:] 。主要是做那种能拉长,收缩的图片,类似温度计一样的东西。

---------------------------------------------<。。。。。>------------------

先写这些,剩下的,过些日子再做整理。