自定义控件的方法有两种,一种是通过纯代码添加,另一种是通过添加xib文件添加.然而两种方法都可以添加,由此可以总结出两种方法的区别和步骤
一.通过代码自定义控件
1>.新建一个继承UIView的类,(所谓自定义控件就是继承系统自带的控件写一个自己的控件)
2>.在initWithFrame方法中添加子控件(保证别人在外面不管是通过init还是initWithFrame创建都能够添加子控件,因为init方法内部会调用initWithFrame
3>.在layoutSubViews方法中设置子控件的frame(因为在InitWithFrame方法中当前控件尺寸可能没值,所以计算不了子控件的位置和尺寸,而在layoutSubViews方法,能够拿到当前控件的尺寸)
4>.提供一个模型属性,重写模型属性的set方法(保证在别人在设置数据的那一刻就可以拿到数据设置到对应的子控件上)
二.通过xib自定义控件
1>.新建一个继承UIView的类,(所谓自定义控件就是继承系统自带的控件写一个自己的控件)
2>.新建一个xib文件(xib的文件名最好和类名一样)
3>.修改最外面那个控件的class为控件类名(只有修改类名,当时候从xib中出来的才是我这种类型的控件,这样就可以管理我们创建出来的xib文件)
4>.提供一个模型属性,重写模型属性的set方法(保证在别人在设置数据的那一刻就可以拿到数据设置到对应的子控件上)
通过运行程序我们可以看出,控件通过xib或者storyboard初始化的时候一定会调用initWithCoder方法,二控件如果通过纯代码创建就只会调用initWithFrame方法,所以我们要在初始化时候添加一些属性或者子控件的一些东西,最好是重写这两个方法来获取.需要注意的一点是,通过alloc/init或者alloc/initWithFrame方法来创建控件,不会主动加载xib文件,即使xib文件的文件名和类名一样也是不可以的.
最后分享一个有关于解决图片拉伸之后变得不好看的问题的解决办法,可以添加一个分类来创建一个方法,代码如下:
一.通过代码自定义控件
1>.新建一个继承UIView的类,(所谓自定义控件就是继承系统自带的控件写一个自己的控件)
2>.在initWithFrame方法中添加子控件(保证别人在外面不管是通过init还是initWithFrame创建都能够添加子控件,因为init方法内部会调用initWithFrame
3>.在layoutSubViews方法中设置子控件的frame(因为在InitWithFrame方法中当前控件尺寸可能没值,所以计算不了子控件的位置和尺寸,而在layoutSubViews方法,能够拿到当前控件的尺寸)
4>.提供一个模型属性,重写模型属性的set方法(保证在别人在设置数据的那一刻就可以拿到数据设置到对应的子控件上)
二.通过xib自定义控件
1>.新建一个继承UIView的类,(所谓自定义控件就是继承系统自带的控件写一个自己的控件)
2>.新建一个xib文件(xib的文件名最好和类名一样)
3>.修改最外面那个控件的class为控件类名(只有修改类名,当时候从xib中出来的才是我这种类型的控件,这样就可以管理我们创建出来的xib文件)
4>.提供一个模型属性,重写模型属性的set方法(保证在别人在设置数据的那一刻就可以拿到数据设置到对应的子控件上)
通过运行程序我们可以看出,控件通过xib或者storyboard初始化的时候一定会调用initWithCoder方法,二控件如果通过纯代码创建就只会调用initWithFrame方法,所以我们要在初始化时候添加一些属性或者子控件的一些东西,最好是重写这两个方法来获取.需要注意的一点是,通过alloc/init或者alloc/initWithFrame方法来创建控件,不会主动加载xib文件,即使xib文件的文件名和类名一样也是不可以的.
最后分享一个有关于解决图片拉伸之后变得不好看的问题的解决办法,可以添加一个分类来创建一个方法,代码如下:
+ (UIImage *)resizingImageWithImageName:(NSString *)imageName
{
// 1.创建图片对象
UIImage *image = [UIImage imageNamed:imageName];
// 2.找到可拉伸的区域
CGFloat imageW = image.size.width;
CGFloat imageH = image.size.height;
// // 3.创建可拉伸的图片
// UIImage *resizingImage = [image resizableImageWithCapInsets:UIEdgeInsetsMake(imageH * 0.5, imageW * 0.5, imageH * 0.5 - 1, imageW * 0.5 -1) resizingMode:UIImageResizingModeTile];
//
// // 4.返回可拉伸的图片
// return resizingImage;
// 3.创建可拉伸的图片
image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(imageH * 0.5, imageW * 0.5, imageH * 0.5 - 1, imageW * 0.5 -1) resizingMode:UIImageResizingModeTile];
return image;
通过这种方法,可以轻松解决图片被拉伸之后发生的一些改变.只要传入一个图片参数,就返回一个可以拉伸并且拉伸之后不会改变其他细节的图片.