自定义UISegmentedControl
在iOS项目开发中,系统自带的控件并不能时时满足我们的需求,更多的是要自己自定义控件,最近在项目中,根据美工的设计,我也需要自定义一个UISegmentedControl,其实自定义这个控件还是挺简单的,不过还是决定写一篇文章把这个过程记录下来。
主要步骤
无高亮状态按钮的实现
首先,看着系统的的UISegmentedControl,可以发现,系统的分段在按下去之后是没有高亮状态的,我不知道系统的是用的什么子控件,我为了方便,采用了UIButton,但是UIButton有高亮状态,于是便需要从UIButton继承,覆写其中的setHighlighted方法,这样即可实现一个无高亮状态的按钮了,代码如下:
-(void)setHighlighted:(BOOL)highlighted {
return [super setHighlighted:NO];
}
以前我看到别人有一种写法,就是在一个分类里面覆写一个已经存在的方法是什么意思,这个和原来一个类中存在的方法有什么区别,到底是先调用系统的方法再调用分类中同样的方法,还是只调用系统的方法忽略分类中的方法,还是只调用分类中的方法忽略系统系统中的方法,于是我就自己试着这样写了一下,代码如下:
@implementation UIButton (noHighlighted)
- (void)setHighlighted:(BOOL)highlighted {
return [super setHighlighted:NO];
}
@end
经过证实,其实这种写法和覆盖系统的方法是一样的,只是利用分类的好处,覆写原有类中的方法,不需要重新继承一个罢了,可是这样做是有问题的,就是其他的按钮都会变成无高亮状态的按钮,这并不是我希望的,所以还是老老实实继承一个出来比较好。
控件的主要实现
MyCustomSegmentedControl类
为了实现背景的自定义,比如说用图片做背景等需求,我整体采用了一个UIImageView,其他所有的控件都是加在这个背景ImageView当中,该类的主要情况如下所示:
@interface MyCustomSegmentedControl : UIImageView
-(instancetype)initWithArray:(NSArray*)items;
-(instancetype)initWithItems:(NSString*)item, ... NS_REQUIRES_NIL_TERMINATION;
-(void)setItemsWithTitle:(NSString*)title,... NS_REQUIRES_NIL_TERMINATION;
-(void)setItemsWithArray:(NSArray*)items;
-(void)addTarget:(