iOS之UIView的常用方法
1.向一个已知 UIVIew 中加入子视图
- (void)addSubview:(UIView *)view; - (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview; - (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;
理解:
- 第一个表示向当前 UIVIew 插入子视图,其实是插入到当前所有子视图的最上面;
- 第二个表示向指定的子视图之下,插入该视图;
- 第三个表示向指定的子视图之上,插入该视图。
2.将一个视图丢到最上面,或最下面
- (void)bringSubviewToFront:(UIView *)view; - (void)sendSubviewToBack:(UIView *)view;
理解:
- 第一个表示将一个父视图的子视图带到所有子视图的最上面;
- 第二个表示将一个父视图的子视图带到所有子视图的最下面;
3.交换两个视图的图层顺序
- (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2;
理解:
- 表示将一个父视图的两个子视图交换顺序;
注意: 一定要理解正确,不是改变两个图层的位置(即不是改变 frame),二是改变图形顺序。
4.将子视图从父视图中移除掉
- (void)removeFromSuperview;
理解:
- 子视图从父视图中移除掉;
5.视图的 tag
@property(nonatomic) NSInteger tag;
- (UIView *)viewWithTag:(NSInteger)tag;
理解:
- tag 是个标识,注意与视图层次顺序无关;
- 根据tag标识取出对应view
6.点坐标转换
- (CGPoint)convertPoint:fromView:
- (CGPoint)convertPoint:toView:
- (CGRect)convertRect:fromView:
- (CGRect)converRect:toView:
理解:
- 把一个点从一个坐标系转换到接收者的坐标系 - (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view 参数 point 一个视图中坐标系上的点 view 一个视图包含了点和他自 身坐标系。如果是图是nil,那么这个方法将尝试转换基于窗口的坐标系。否则视图和那个接收 者必须属于同一个UIWindow对象。 返回值 一个转换到接收者坐标系的点
示例:CGPoint viewPoint = [self.view convertPoint:testView.frame.origin fromView:testView]; - 转换一个点从接收者坐标系到给定的视图坐标系 - (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view 参数 point 一个在调用者坐标系中的点 view 一个包含了需要被转换的点 的视图。如果视图是nil,那么这个方法将会转换成基于窗口的坐标。否则视图和接收者都要属 于同一个UIWindow对象。 返回值 基于视图的坐标系转换过的点
示例:CGPoint viewPoint2 = [self.view convertPoint:testView.frame.origin toView:bringView]; - 转换一个矩形从其他视图坐标系到接收者坐标系。 - (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view 参数 rect 一个在视图坐标系中的矩形 view 一个视图内部有矩形在他 的坐标系中。如果视图是nil,那么这个方法将会基于窗口来转换。否则视图和接收者必须都属 于同一个UIWindow对象 返回值 The converted rectangle 转换过的矩形
示例:CGRect rc = [self.view convertRect:cell.btn.frame fromView:cell]; - 转换接收者坐标系中的矩形到其他视图 - (CGRect)convertRect:(CGRect)rect toView:(UIView *)view 参数 rect 一个在接收者坐标系中的矩形 view 要转换过去的目标视图对象。如果这个是 视图是nil,这个方法将会基于窗口坐标系来转换。否者视图和接收者必须属于同一个 UIwindow对象 返回值 一个转换过的矩形
示例:CGRect rc = [cell convertRect:cell.btn.frame toView:self.view];
7.系统自动调用(留给子类去实现)
- (void)didAddSubview:(UIView *)subview; - (void)willRemoveSubview:(UIView *)subview; - (void)willMoveToSuperview:(UIView *)newSuperview; - (void)didMoveToSuperview; - (void)willMoveToWindow:(UIWindow *)newWindow; - (void)didMoveToWindow;
理解:
- 通知视图本身已添加子视图,并已经改变。默认不做任何 事情;子类可以重写这方法来作为特定的实现
- 通知视图本身子视图将移除。默认不做任何 事情;子类可以重写这方法来作为特定的实现
- 通知接收者父视图将要改变(nil是允许的) - (void)willMoveToSuperview 讨论 默认不做任何 事情;子类可以重写这方法来作为特定的实现
- 通知接收者父视图已经改变(nil是允许的) - (void)didMoveToSuperview 讨论 默认不做任何 事情;子类可以重写这方法来作为特定的实现
- 通知接收者窗口将要改变(nil是允许的) - (void)willMoveToWindow:(UIWindow *)newWindow 讨论 默认不做任何 事情;子类可以重写这方法来作为特定的实现
- 通知接收者窗口将要已经(nil是允许的) - (void)didMoveToWindow 讨论 默认不做任何 事情;子类可以重写这方法来作为特定的实现
8.判断子view是否添加到父view上
- (BOOL)isDescendantOfView:(UIView *)view;
理解:
-
判断自身是不是view的子控件或者子控件的子控件(是否为view的后代)
9. 响应者链
- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event; - (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event;
理解:
-
返回一个view来响应事件 (我们如果不想影响系统的事件传递链,在这个方法内,最好调用父类的这个方法)
-
返回的值可以用来判断是否继续遍历子视图(返回的根据是触摸的point是否在view的frame范围内)
10. 刷新布局
-(void)layoutSubviews - (void)setNeedsLayout; - (void)layoutIfNeeded;
理解:
-
排列子视图 - (void)layoutSubviews 讨论 当layoutIfNeeded被调用是子类用来重写这个方法来 排列子视图。默认实现这个方法不做任何事情。
示例:
-(void)layoutSubviews{ [super layoutSubviews]; NSLog(@"layoutSubviews"); }
-
排列子视图如果需要的话 - (void)layoutIfNeeded 讨论 使用这个方法来关注子视图的排列在绘 制前。
[self.view layoutIfNeeded];
-
设置当子视图显示的时候需要重新排列 - (void)setNeedsLayout 讨论 如果你调用这个方法在下 一个显示方法之间,那么layoutIfNeeded排列子视图;否则将不会做任何事情
[self.view setNeedsLayout];
11. 图像绘制(重写该方法以实现自定义的绘制内容)
- (void)drawRect:(CGRect)rect; - (void)setNeedsDisplay; - (void)setNeedsDisplayInRect:(CGRect)rect;
理解:
-
判断自身是不是view的子控件或者子控件的子控件(是否为view的后代)
-
标记为需要重绘,异步调用drawRect,但是绘制视图的动作需要等到下一个绘制周期执行,并非调用该方法立即执行;
[self.view setNeedsDisplay];
-
标记为需要局部重绘,具体调用时机同上;
[self.view setNeedsDisplayInRect:CGRectMake(10, 10, 10, 10)]
总结:
所以,当需要刷新布局时,用setNeedsLayOut方法;当需要重新绘画时,调用setNeedsDisplay方法。
12. UILabel自适应高度 (一般在使用UILabel的时候会用到,使用这两个方法之前,必须要给label赋值,否则不会显示内容的)
- (CGSize)sizeThatFits:(CGSize)size; - (void)sizeToFit;
理解:
-
会计算出最优的 size 但是不会改变 自己的 size,个人认为这个就是 label 自适应大小有用别的没什么用。
CGSize size = [self.view sizeThatFits:CGSizeMake(100, 100)];
-
会计算出最优的 size 而且会改变自己的size
[self.view sizeToFit]