效果图:
关键类:使用第三方Masonry,进行自动布局,VariableRoundedBorderLabel
SegView.h
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@protocol SegViewDelegate<NSObject>
@optional
-(void)SegViewItemClick:(NSInteger)index;
-(void)SegViewItemClick:(NSInteger)index isDefault:(BOOL)isDefault;
-(void)SegViewItemClick:(NSInteger)index text:(NSString *)text tag:(NSInteger)tag isDefault:(BOOL)isDefault;
@end
@interface SegView : UIView
@property (nonatomic, weak) IBOutlet id<SegViewDelegate> delegate;
@property(nonatomic,unsafe_unretained)IBInspectable NSInteger defaultSelectIndex;//默认选中的索引
@property(nonatomic,strong)IBInspectable UIFont *defaultLabelFont;//默认字体
@property(nonatomic,strong)IBInspectable UIColor *selectBgColor;//选中的背景颜色
@property(nonatomic,strong)IBInspectable UIColor *unSelectBgColor;//没有选中的背景颜色
@property(nonatomic,strong)IBInspectable UIColor *borderColor;//边框颜色
@property(nonatomic,unsafe_unretained)IBInspectable CGFloat borderWidth;//边框宽度
@property(nonatomic,strong)IBInspectable UIColor *selectLabelTextColor;//选中的文本颜色
@property(nonatomic,strong)IBInspectable UIColor *unSelectLabelTextColor;//没有选中的文本颜色
@property(nonatomic,unsafe_unretained)BOOL isDefaultSelect;
@property(nonatomic,unsafe_unretained)BOOL isVertical;
-(void)addTexts:(NSArray *)texts;
@end
SegView.m
#import "SegView.h"
#import "Masonry.h"
#import "VariableRoundedBorderLabel.h"
@interface SegView (){
NSArray *_texts;
BOOL _isAdd;
NSMutableArray *_bgArr;
NSMutableArray *_labelArr;
NSInteger _selectIndex;
CGRect _rect;
}
@end
@implementation SegView
- (void)awakeFromNib {
[super awakeFromNib];
[self commonInit];
}
-(instancetype)init {
if (self = [super init]) {
[self commonInit];
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
[self commonInit];
}
return self;
}
-(instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self commonInit];
}
return self;
}
- (instancetype)initWithBtns:(NSArray *)btns vc:(UIViewController *)vc
{
self = [super init];
if (self) {
//[self Btns:btns vc:vc];
}
return self;
}
-(void)commonInit{
self.backgroundColor = [UIColor clearColor];
self.defaultLabelFont = [UIFont systemFontOfSize:12];
self.borderWidth = 2;
self.isDefaultSelect = YES;
}
-(NSArray *)getLabelArr {
return _labelArr;
}
-(NSArray *)getBgArr {
return _bgArr;
}
- (void)drawRect:(CGRect)rect {
_selectIndex = self.defaultSelectIndex;
if (_isAdd) {
//[self removeFromSuperview];
_rect = rect;
if (self.isVertical) {
[self addLabelVertical];
}else {
[self addLabel];
}
}
}
-(void)addLabel {
CGFloat padding = 0.0f;
NSInteger count = _texts.count;
UILabel * tempLabel = nil;
for (UIView *view in _labelArr) {
[view removeFromSuperview];
}
_labelArr = [NSMutableArray array];
for (NSInteger i = 0; i<count; i++) {
VariableRoundedBorderLabel * label = VariableRoundedBorderLabel.new;
label.font = self.defaultLabelFont;
[self commonInitBg:label tag:i];
label.borderWidth = self.borderWidth;
label.borderColor = self.borderColor;
label.minimumScaleFactor = 0.1;
label.adjustsFontSizeToFitWidth = YES;
label.numberOfLines = 0;
[_labelArr addObject:label];
label.text = _texts[i];
label.textAlignment = NSTextAlignmentCenter;
[self addSubview:label];
if (self.defaultSelectIndex == i) {
if (self.selectLabelTextColor) {
label.textColor = self.selectLabelTextColor;
}
if (self.selectBgColor) {
label.backgroundColor = self.selectBgColor;
}
}else {
if (self.unSelectLabelTextColor) {
label.textColor = self.unSelectLabelTextColor;
}
if (self.unSelectBgColor) {
label.backgroundColor = self.unSelectBgColor;
}
}
if (i == 0) {
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self).offset(padding);
make.height.equalTo(@(_rect.size.height));
make.centerY.equalTo(self);
}];
label.corners = UIRectCornerTopLeft | UIRectCornerBottomLeft;
label.radius = 5;
label.BD = BorderDirectionLeft|BorderDirectionTop|BorderDirectionBottom;
} else if (i == count -1) {
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(tempLabel.mas_right).offset(padding);
make.right.equalTo(self.mas_right).offset(-padding);
make.height.equalTo(tempLabel);
make.width.equalTo(tempLabel);
make.centerY.equalTo(tempLabel);
}];
label.corners = UIRectCornerTopRight | UIRectCornerBottomRight;
label.radius = 5;
label.BD = BorderDirectionRight|BorderDirectionTop|BorderDirectionBottom;
} else {
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(tempLabel.mas_right).offset(padding);
make.centerY.equalTo(tempLabel);
make.height.equalTo(tempLabel);
make.width.equalTo(tempLabel);
}];
label.radius = 0;
if (i == count -2) {
label.BD = BorderDirectionAllCorners;
}else {
label.BD = BorderDirectionLeft|BorderDirectionTop|BorderDirectionBottom;
}
}
tempLabel = label;
}
if(self.isDefaultSelect) {
[self callBack:_selectIndex isDefault:YES];
}
}
-(void)addLabelVertical {
CGFloat padding = 0.0f;
NSInteger count = _texts.count;
UILabel * tempLabel = nil;
for (UIView *view in _labelArr) {
[view removeFromSuperview];
}
_labelArr = [NSMutableArray array];
for (NSInteger i = 0; i<count; i++) {
VariableRoundedBorderLabel * label = VariableRoundedBorderLabel.new;
label.font = self.defaultLabelFont;
[self commonInitBg:label tag:i];
label.borderWidth = self.borderWidth;
label.borderColor = self.borderColor;
label.minimumScaleFactor = 0.1;
label.adjustsFontSizeToFitWidth = YES;
label.numberOfLines = 0;
[_labelArr addObject:label];
label.text = _texts[i];
label.textAlignment = NSTextAlignmentCenter;
[self addSubview:label];
if (self.defaultSelectIndex == i) {
if (self.selectLabelTextColor) {
label.textColor = self.selectLabelTextColor;
}
if (self.selectBgColor) {
label.backgroundColor = self.selectBgColor;
}
}else {
if (self.unSelectLabelTextColor) {
label.textColor = self.unSelectLabelTextColor;
}
if (self.unSelectBgColor) {
label.backgroundColor = self.unSelectBgColor;
}
}
if (i == 0) {
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self).offset(padding);
make.width.equalTo(@(_rect.size.width));
make.centerX.equalTo(self);
}];
label.corners = UIRectCornerTopLeft | UIRectCornerTopRight;
label.radius = 5;
label.BD = BorderDirectionLeft|BorderDirectionTop|BorderDirectionRight;
} else if (i == count -1) {
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(tempLabel.mas_bottom).offset(padding);
make.bottom.equalTo(self.mas_bottom).offset(-padding);
make.height.equalTo(tempLabel);
make.width.equalTo(tempLabel);
make.centerX.equalTo(tempLabel);
}];
label.corners = UIRectCornerBottomLeft | UIRectCornerBottomRight;
label.radius = 5;
label.BD = BorderDirectionRight|BorderDirectionLeft|BorderDirectionBottom;
} else {
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(tempLabel.mas_bottom).offset(padding);
make.centerX.equalTo(tempLabel);
make.height.equalTo(tempLabel);
make.width.equalTo(tempLabel);
}];
label.radius = 0;
if (i == count -2) {
label.BD = BorderDirectionAllCorners;
}else {
label.BD = BorderDirectionLeft|BorderDirectionTop|BorderDirectionRight;
}
}
tempLabel = label;
}
if(self.isDefaultSelect) {
[self callBack:_selectIndex isDefault:YES];
}
}
-(void)commonInitBg:(UIView *)bg tag:(NSInteger)tag{
bg.userInteractionEnabled=YES;
bg.clipsToBounds = YES;
UITapGestureRecognizer *ges=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(On_Item_Click:)];
ges.numberOfTapsRequired=1;
ges.numberOfTouchesRequired=1;
bg.tag = tag;
[bg addGestureRecognizer:ges];
}
-(void)On_Item_Click:(UITapGestureRecognizer*)ges
{
_selectIndex = ges.view.tag;
for (UILabel *label in _labelArr) {
if (self.unSelectLabelTextColor) {
label.textColor = self.unSelectLabelTextColor;
}
if (self.unSelectBgColor) {
label.backgroundColor = self.unSelectBgColor;
}
}
UILabel *label = _labelArr[_selectIndex];
if (self.selectLabelTextColor) {
label.textColor = self.selectLabelTextColor;
}
if (self.selectBgColor) {
label.backgroundColor = self.selectBgColor;
}
[self callBack:_selectIndex isDefault:NO];
}
-(void)callBack:(NSInteger)index isDefault:(BOOL)isDefault{
if ([self.delegate respondsToSelector:@selector(SegViewItemClick:)]) {
[self.delegate SegViewItemClick:index];
}
if ([self.delegate respondsToSelector:@selector(SegViewItemClick:isDefault:)]) {
[self.delegate SegViewItemClick:index isDefault:isDefault];
}
if ([self.delegate respondsToSelector:@selector(SegViewItemClick:text:tag:isDefault:)]) {
[self.delegate SegViewItemClick:index text:_texts[index] tag:self.tag isDefault:isDefault];
}
}
-(void)addTexts:(NSArray *)texts {
_isAdd = YES;
_texts = texts;
[self setNeedsDisplay];
}
@end
使用:
ViewController.m
#import "ViewController.h"
#import "SegView.h"
@interface ViewController ()<SegViewDelegate>
@property (weak, nonatomic) IBOutlet SegView *segView;
@property (weak, nonatomic) IBOutlet SegView *segView2;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.segView.selectBgColor = [UIColor blueColor];
self.segView.borderColor = [UIColor blueColor];
self.segView.unSelectBgColor = [UIColor whiteColor];
self.segView.selectLabelTextColor = [UIColor whiteColor];
self.segView.unSelectLabelTextColor = [UIColor blueColor];
self.segView.delegate = self;
self.segView.tag = 1;
[self.segView addTexts:@[@"1",@"2",@"3",@"4",@"5",@"我是长文字"]];
self.segView2.selectBgColor = [UIColor blueColor];
self.segView2.borderColor = [UIColor blueColor];
self.segView2.unSelectBgColor = [UIColor whiteColor];
self.segView2.selectLabelTextColor = [UIColor whiteColor];
self.segView2.unSelectLabelTextColor = [UIColor blueColor];
self.segView2.tag = 2;
self.segView2.delegate = self;
self.segView2.isVertical = YES;
[self.segView2 addTexts:@[@"1",@"2",@"3",@"4",@"5",@"我是长文字"]];
}
-(void)SegViewItemClick:(NSInteger)index text:(NSString *)text tag:(NSInteger)tag isDefault:(BOOL)isDefault {
}
@end