ios 自定義UISegmentedControl 橫向和豎向,文字自適應或換行

效果圖:

關鍵類:使用第三方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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章