iOS自定义控件开发梳理总结

2020-01-18 17:13:17于海丽

在日常iOS开发中,系统提供的控件常常无法满足业务功能,这个时候需要我们实现一些自定义控件。自定义控件能让我们完全控制视图的展示内容以及交互操作。本篇将介绍一些自定义控件的相关概念,探讨自定义控件开发的基本过程及技巧。

UIView

在开始之前我们先介绍一个类UIVew,它在iOS APP中占有绝对重要的地位,因为几乎所有的控件都是继承自UIView类。
UIView表示屏幕上的一个矩形区域,负责渲染区域内的内容,并且响应区域内发生的触摸事件。

在UIView的内部有一个CALayer,提供内容的绘制和显示,包括UIView的尺寸样式。UIView的frame实际上返回的CALayer的frame。

UIView继承自UIResponder类,它能接收并处理从系统传来的事件,CALayer继承自NSObject,它无法响应事件。所以UIView与CALayer的最大区别在于:UIView能响应事件,而CALayer不能。
更详细的资料:https://www.easck.com/reference/uikit/uiview

两种实现方式
在创建自定义控件时,主要有两种实现方式,分别是纯代码以及xib。接下来我们用这两种方式分别演示一下创建自定义控件的步骤。
我们实现一个简单的demo ,效果如下,封装一个圆形的imageView。
ios,自定义控件,自定义uiview,ios自定义控件开发
使用代码创建自定义控件
使用代码创建自定义控件,首先创建一个继承自UIView的类ios,自定义控件,自定义uiview,ios自定义控件开发

实现initWithFrame:方法。在该方法中,设置自定义控件的属性,并创建、添加子视图:


-(instancetype)initWithFrame:(CGRect)frame {
 self = [super initWithFrame:frame];
 if (self) {
  _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
  _imageView.contentMode = UIViewContentModeScaleAspectFill;
  _imageView.layer.masksToBounds = YES;
  _imageView.layer.cornerRadius = frame.size.width/2;
  [self addSubview:_imageView];

 }
 return self;
}

如果需要对子视图重新布局,需要调用layoutSubViews方法:


-(void)layoutSubviews {
 [super layoutSubviews];
 _imageView.frame = self.frame;
 _imageView.layer.cornerRadius = self.frame.size.width/2;

}

layoutSubviews是调整子视图布局的方法,官方文档如下:

You should override this method only if the autoresizing and constraint-based behaviors of the subviews do not offer the behavior you want.

意思是当你需要调整subview的大小的时候,重写layoutSubviews方法。

layoutSubviews在以下情况下会被调用: