iOS自定义Segment控件

在我们开发中经常会遇到这样的需求 如下图:


下面是我自定义这个控件的过程:

  • 新建一个UIView
SegmentView.h中:
#import <UIKit/UIKit.h>
typedef void(^SelectIndexBlock)(NSInteger selectIndex);
@interface SegmentView : UIView

NS_ASSUME_NONNULL_BEGIN
//默认背景颜色
@property (nonatomic, strong) UIColor *bgColor;
//默认图片颜色
@property (nonatomic, strong) UIColor *imageColor;
//默认字体颜色
@property (nonatomic, strong) UIColor *titleColor;
//选中背景颜色
@property (nonatomic, strong) UIColor *selectBgColor;
//选中图片颜色
@property (nonatomic, strong) UIColor *selectImageColor;
//选中字体颜色
@property (nonatomic, strong) UIColor *selectTitleColor;
//滚动条颜色
@property (nonatomic, strong) UIColor *scrollViewColor;

@property (nonatomic, copy) SelectIndexBlock selectBlock;

@property (nonatomic, assign) NSInteger selectedIndex;
//外部调用的接口
- (instancetype)initWithFrame:(CGRect)frame imageArray:(NSArray *)imageArray selectImageArray:(NSArray *)selectImageArray titleArray:(NSArray *)titleArray defaultSelectIndex:(NSInteger)selectedIndex selectBlock:(SelectIndexBlock)selectBlock;

- (void)selectedIndex:(NSInteger)selectIndex;

@end
NS_ASSUME_NONNULL_END
SegmentView.m中:

#import "SegmentView.h"
#import "MacroDefinition.h"
#import "HJTCustomMD.h"
@interface SegmentView ()
@property (weak, nonatomic) IBOutlet UIButton *buttonOne;
@property (weak, nonatomic) IBOutlet UIButton *buttonTwo;
@property (weak, nonatomic) IBOutlet UIButton *buttonThree;
@property (weak, nonatomic) IBOutlet UIImageView *imageOne;
@property (weak, nonatomic) IBOutlet UIImageView *imageTwo;
@property (weak, nonatomic) IBOutlet UIImageView *imageThree;
@property (weak, nonatomic) IBOutlet UILabel *labelOne;
@property (weak, nonatomic) IBOutlet UILabel *labelTwo;
@property (weak, nonatomic) IBOutlet UILabel *labelThree;
@property (weak, nonatomic) IBOutlet UIView *selectedView;
@property (nonatomic, strong) NSArray *titleArray;
@property (nonatomic, strong) NSArray *imageArray;
@property (nonatomic, strong) NSArray *selectImageArray;


@property (nonatomic, strong) NSArray *labelArray;
@property (nonatomic, strong) NSArray *defaultImageArray;

@end
@implementation SegmentView

-(instancetype)initWithFrame:(CGRect)frame imageArray:(NSArray * __nonnull)imageArray selectImageArray:(NSArray * __nonnull)selectImageArray titleArray:(NSArray * __nonnull)titleArray defaultSelectIndex:(NSInteger)selectedIndex selectBlock:(SelectIndexBlock __nonnull)selectBlock{
    self = [[[NSBundle mainBundle] loadNibNamed:@"SegmentView" owner:self options:nil] objectAtIndex:0];
    if (self) {
        self.frame = frame;
        NSAssert([imageArray count] == 3 && [titleArray count] == 3 && [selectImageArray count] == 3, @"Parameters error");
        self.selectBlock = selectBlock;
        self.titleArray = titleArray;
        self.imageArray = imageArray;
        self.selectImageArray = selectImageArray;
        self.selectedIndex = selectedIndex;
        
        [self initViews];
    }
    return  self;
}


- (void)selectedIndex:(NSInteger)selectIndex
{
    NSAssert(selectIndex >= 0 && selectIndex <= 2, @"Parameters error");
    
    [self selectIndex:selectIndex];
}


- (void)initViews
{
    self.labelOne.text = self.titleArray[0];
    self.labelTwo.text = self.titleArray[1];
    self.labelThree.text = self.titleArray[2];
    
    self.imageOne.image = [UIImage imageNamed:self.imageArray[0]];
    self.imageTwo.image = [UIImage imageNamed:self.imageArray[1]];
    self.imageThree.image = [UIImage imageNamed:self.imageArray[2]];
    
    self.defaultImageArray = [NSArray arrayWithObjects:self.imageOne,self.imageTwo,self.imageThree, nil];
    self.labelArray = [NSArray arrayWithObjects:self.labelOne,self.labelTwo,self.labelThree, nil];
    
    self.selectedView.backgroundColor = RGB(135, 244, 224);
    
    self.imageOne.image = [UIImage imageNamed:self.selectImageArray[0]] ;
}

- (void)selectIndex:(NSInteger)selectIndex
{
    for (UILabel *label in self.labelArray) {
        label.textColor = RGB(158, 155, 156);
    }
    
    self.imageOne.image = [UIImage imageNamed:self.imageArray[0]];
    self.imageTwo.image = [UIImage imageNamed:self.imageArray[1]];
    self.imageThree.image = [UIImage imageNamed:self.imageArray[2]];
    
    switch (selectIndex) {
        case 0:
        {
            _labelOne.textColor = RGB(135, 244, 224);
            self.imageOne.image = [UIImage imageNamed:self.selectImageArray[0]];
            
            WS
            [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
                SS
                strongSelf.selectedView.center = CGPointMake(strongSelf.buttonOne.center.x, strongSelf.selectedView.center.y);
            } completion:nil];
            
        }
            break;
            
        case 1:
        {
            _labelTwo.textColor = RGB(135, 244, 224);
            self.imageTwo.image = [UIImage imageNamed:self.selectImageArray[1]];
            
            WS
            [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
                SS
                strongSelf.selectedView.center = CGPointMake(strongSelf.buttonTwo.center.x, strongSelf.selectedView.center.y);
            } completion:nil];
            
        }
            break;
            
        case 2:
        {
            _labelThree.textColor = RGB(135, 244, 224);
            self.imageThree.image = [UIImage imageNamed:self.selectImageArray[2]];
            
            
            WS
            [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
                SS
                strongSelf.selectedView.center = CGPointMake(strongSelf.buttonThree.center.x, strongSelf.selectedView.center.y);
            } completion:nil];
            
            
        }
            break;
            
        default:
            break;
    }
}

- (IBAction)select:(UIButton *)sender {
    switch (sender.tag) {
        case 111:
        {
            [self selectIndex:0];
            self.selectBlock(0);
            
        }
            break;
            
        case 222:
        {
            [self selectIndex:1];
            self.selectBlock(1);
        }
            break;
            
        case 333:
        {
            [self selectIndex:2];
            self.selectBlock(2);
        }
            break;
            
        default:
            break;
    }
    
}


@end
  • 新建一个XIB文件(新建这个xib的时候名字和刚才的UIView的类名保持一致):

将其class设置为刚才建立的UIView的类名 并将其进行约束

  • 下面简要说一下这个过程:
    (1)拖入一个UIButton,设置其在容器中居中对齐,设置上下约束。
    (2)复制两个UIButton分别设置距离容器左边距 、右边距和到中间Button的水平距离。
    (3)选中这三个Button设置它们水平中心线对齐,然后分别设置它们的tag值。
    (4)按钮上的Image和Label的设置和UIButton的约束方式是一样的就不在赘述。
    (5)最后是哪一条滚动的线条,设置它的宽、高以及和UIButton底部对齐。好了约束完了,这个控件也封装完了。

使用

(1)在需要使用的类中导入#import "SegmentView.h",将其声明为全局变量。

@interface ViewController (){
    SegmentView *segment;
}
segment = [[SegmentView alloc]initWithFrame:CGRectMake(0, 64, WIDTH, 68) imageArray:@[@"Search_repository-gray@2x", @"Search_community-gray@2x", @"Search_say-gray@2x"] selectImageArray:@[@"Search_repository@2x",@"Search_community@2x",@"Search_say@2x"] titleArray:@[@"one",@"two",@"three"] defaultSelectIndex:1 selectBlock:^(NSInteger selectIndex) {
        
    }];
    segment.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:segment];

Demo地址:https://github.com/hejintaochenxin/segMent

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容