·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> IOS开发--自定义segment控件,方便自定义样式

IOS开发--自定义segment控件,方便自定义样式

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

系统的segment控件太封闭,想换个颜色加个背景太难了,忍不住自己写一个,以备不时之需

这个控件给出了很多自定义属性的设置,用起来还是比较方便的,需要注意的 itemWidth如果不设置,则会按照控件的宽度平均分配每一项的宽度,如果设置了,那么总宽度超过控件宽度后会有滑动效果

直接上代码吧:

头文件:

#import <Foundation/Foundation.h>


@PRotocol WCSegmentControlDelegate

-(void)wcSegmentControlSelectionChanged:(id)sender;

@end


@interface WCSegmentControl : UIView

@property (nonatomic, strong)id<WCSegmentControlDelegate>delegate;

@property (nonatomic, strong) NSMutableArray *dataSourceOFTitle;
@property (nonatomic, assign, setter=setCurrentSelectedIndex:) int currentSelectedIndex;

//title color
@property (nonatomic, strong) UIColor *titleColor;
@property (nonatomic, strong) UIColor *selectedTitleColor;

//font
@property (nonatomic, strong) UIFont *titleFont;

//item selectedBackground  Color;
@property (nonatomic, strong) UIColor *itemBackgroundColor;
@property (nonatomic, strong) UIColor *selectedItemBackgroundColor;

//item selectedBackground image;
@property (nonatomic, strong) UIImage *itemBackgroundImage;
@property (nonatomic, strong) UIImage *selectedItemBackgroundImage;

//item border
@property (nonatomic, strong) UIColor *itemBorderColor;
@property (nonatomic, assign) BOOL isShowItemBorderWhenHilight;
@property (nonatomic, assign) int itemBorderWidth;
@property (nonatomic, assign) int itemCornerRadius;

//item, 不设置则均分控件宽度
@property (nonatomic, assign) int itemWidth;



//control border
@property (nonatomic, strong) UIColor *borderColor;
@property (nonatomic, assign) BOOL isShowBorder;
@property (nonatomic, assign) int borderWidth;
@property (nonatomic, assign) int cornerRadius;

//分割线
@property (nonatomic, strong) UIColor *splitColor;
@property (nonatomic, assign) int splitBorderWidth;
@property (nonatomic, assign) BOOL isShowSplitBorder;


@end

 

 

实现文件:

#import "WCSegmentControl.h"
#import "WCSegmentControlItemButton.h"


@implementation WCSegmentControl {
    UIScrollView *_scrollView;
}

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.clipsToBounds = YES;

        _scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
        _scrollView.backgroundColor = self.backgroundColor;
        [self addSubview:_scrollView];

        _dataSourceOFTitle = [NSMutableArray array];
        _selectedTitleColor = [UIColor whiteColor];
        _titleColor = [UIColor blackColor];
        _itemBackgroundColor = [UIColor whiteColor];
        _selectedItemBackgroundColor = kWCColor7;

        _borderWidth = 1;
        _borderColor = kWCColor7;
        _cornerRadius = 5;

        _itemBorderColor = kWCColor7;
        _itemBorderWidth = 1;
        _itemCornerRadius = 0;

        _titleFont = [UIFont systemFontOfSize:12];

        _splitColor = kWCColor7;
        _splitBorderWidth = 1;

        _isShowBorder = YES;
        _isShowItemBorderWhenHilight = NO;
        _isShowSplitBorder = YES;
    }

    return self;
}

- (void)setDataSourceOFTitle:(NSMutableArray *)dataSourceOFTitle {
    _dataSourceOFTitle = dataSourceOFTitle;

    [self reloadData];
}

-(WCSegmentControlItemButton *)createItemControlWithTitle:(NSString *)title {
    WCSegmentControlItemButton * btn = [[WCSegmentControlItemButton alloc] init];

    if(_itemBackgroundImage)
    {
        [btn setBackgroundImage:_itemBackgroundImage forState:UIControlStateNormal];
    }
    if(_selectedItemBackgroundImage)
    {
        [btn setBackgroundImage:_selectedItemBackgroundImage forState:UIControlStateSelected];
    }
    [btn setBackgroundColor:_itemBackgroundColor];
    [btn setTitleColor:_selectedTitleColor forState:UIControlStateSelected];
    [btn setTitleColor:_titleColor forState:UIControlStateNormal];
    btn.titleLabel.font = _titleFont;
    [btn setTitle:title forState:UIControlStateNormal];
    btn.layer.cornerRadius = _itemCornerRadius;


    return btn;
}

- (void)refreshUI {
    if (_isShowBorder) {
        self.layer.borderWidth = _borderWidth;
        self.layer.borderColor = _borderColor.CGColor;
        self.layer.cornerRadius = _cornerRadius;
    } else {
        self.layer.borderWidth = 0;

    }
}
    -(void) reloadData
    {

        [_scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];


        if ([_dataSourceOFTitle count] > 0) {

//        UIEdgeInsets
            CGRect fra = CGRectMake(
                    0,
                    0,
                    _itemWidth > 0 ? _itemWidth : self.width / [_dataSourceOFTitle count],
                    self.height);

            CGFloat leftMargin = MAX(0, (self.width -fra.size.width* [self.dataSourceOFTitle count])/2 );
            __block CGFloat contentWidth = leftMargin;
            [self.dataSourceOFTitle enumerateObjectsUsingBlock:^(NSString *title, NSUInteger idx, BOOL *stop) {
                WCSegmentControlItemButton *btn = [self createItemControlWithTitle:title];
                btn.frame = fra;
                btn.left =leftMargin + idx * btn.width;
                [btn addTarget:self action:@selector(btnTapped:) forControlEvents:UIControlEventTouchUpInside];
                btn.index = idx;
                [_scrollView addSubview:btn];

                if (_isShowSplitBorder && idx != 0) {
                     UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, 0, _splitBorderWidth, btn.height)];
                    line.backgroundColor = _splitColor;
                    line.left = btn.left;
                    [_scrollView addSubview:line];
                }
                contentWidth = btn.right;
            }];

            _scrollView.contentSize = CGSizeMake(contentWidth, _scrollView.height);

            [self setCurrentSelectedIndex:0];
            [self refreshUI];

        }
    }

    -(void) btnTapped:(id) sender
    {
        WCSegmentControlItemButton *btn = sender;
        if (self.currentSelectedIndex == btn.index) {
            return;
        }

        [self setCurrentSelectedIndex:btn.index];

        //不可以在setCurrentSelectedIndex触发,否则会造成重复执行
        if ([(NSObject *) (self.delegate) respondsToSelector:@selector(wcSegmentControlSelectionChanged:)]) {
            [self.delegate wcSegmentControlSelectionChanged:self];
        }
    }

    -(void) setCurrentSelectedIndex:(int) currentSelectedIndex
    {
        _currentSelectedIndex = currentSelectedIndex;

        [_scrollView.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            if ([obj isKindOfClass:[WCSegmentControlItemButton class]]) {
                WCSegmentControlItemButton *view = obj;
                if (view.index == currentSelectedIndex) {
                    [view setSelected:YES];
                    [view setBackgroundColor:_selectedItemBackgroundColor];

                    //如果在屏幕外则需要移动到屏幕中
                    if (view.right - _scrollView.width > 0) {
                        _scrollView.contentOffset = CGPointMake(view.right - _scrollView.width, 0)
                        ;
                    }else if (view.left - _scrollView.contentOffset.x < 0) {
                        _scrollView.contentOffset =  CGPointMake(view.left, 0);
                    }

                    if (_isShowItemBorderWhenHilight) {
                        view.layer.borderWidth = _borderWidth;
                        view.layer.borderColor = _borderColor.CGColor;
                        view.layer.cornerRadius = _cornerRadius;
                    }

                } else {
                    [view setSelected:NO];
                    [view setBackgroundColor:_itemBackgroundColor];

                    view.layer.borderWidth = 0;

                }

            }

        }];
    }


    @end