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]

posted on 2018-10-27 03:16  梁飞宇  阅读(447)  评论(0)    收藏  举报