ios 自定义UISegmentedControl 横向和竖向,文字自适应或换行 系统管理员 2021-11-11 18:12 490阅读 0赞 效果图: ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rhc2hlbmlk_size_16_color_FFFFFF_t_70][] 关键类:使用第三方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 使用: ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rhc2hlbmlk_size_16_color_FFFFFF_t_70 1][] 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 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rhc2hlbmlk_size_16_color_FFFFFF_t_70]: /images/20211109/eaec5fbd8abc4ea9b254e11ef5ac20b2.png [VariableRoundedBorderLabel]: https://blog.csdn.net/dashenid/article/details/77651059 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rhc2hlbmlk_size_16_color_FFFFFF_t_70 1]: /images/20211109/c799953c8f2a49c8b725f1317192cf01.png
还没有评论,来说两句吧...