iOS自定义Segment控件

作者: Hither | 来源:发表于2016-06-07 13:01 被阅读2480次

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


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

    • 新建一个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

    相关文章

      网友评论

      • KevinLwg:你好,请问对于每个button,点击后显示不同的view,怎么实现呢?
        Hither:@KevinLwg 好的
        KevinLwg:@秀逗麻得 我现在就是想实现添加scrollview的方法,本人新手,不知道如何具体实现,能详细指导一下吗?谢谢你了。
        Hither:@KevinLwg 方法很多。最简单就是下面放一个scrollView。 或者写成父子控制器

      本文标题:iOS自定义Segment控件

      本文链接:https://www.haomeiwen.com/subject/gdvddttx.html