美文网首页
CBSegmentView

CBSegmentView

作者: Ice_Maple | 来源:发表于2021-05-18 21:37 被阅读0次

    #import

    typedef void(^titleChooseBlock)(NSInteger x);

    typedefNS_ENUM(NSInteger,CBSegmentStyle) {

        /**

         * By default, there is a slider on the bottom.

         */

        CBSegmentStyleSlider =0,

        /**

         * This flag will zoom the selected text label.

         */

        CBSegmentStyleZoom  =1,

    };

    @interface CBSegmentView : UIScrollView

    @property (nonatomic, copy) titleChooseBlock titleChooseReturn;

    /**

     * Set segment titles and titleColor.

     *

     * @paramtitleArrayThe titles segment will show.

     */

    - (void)setTitleArray:(NSArray *)titleArray;

    /**

     * Set segment titles and titleColor.

     *

     * @paramtitleArrayThe titles segment will show.

     * @paramstyleThe segment style.

     */

    - (void)setTitleArray:(NSArray *)titleArraywithStyle:(CBSegmentStyle)style;

    /**

     * Set segment titles and titleColor.

     *

     * @paramtitleArrayThe titles segment will show.

     * @paramtitleColorThe normal title color.

     * @paramselectedColorThe selected title color.

     * @paramstyleThe segment style.

     */

    - (void)setTitleArray:(NSArray *)titleArray

                titleFont:(CGFloat)font

               titleColor:(UIColor*)titleColor

       titleSelectedColor:(UIColor*)selectedColor

                withStyle:(CBSegmentStyle)style;

    @end

    @interfaceUIView(CBViewFrame)

    @property (nonatomic, assign) CGFloat cb_Width;

    @property (nonatomic, assign) CGFloat cb_Height;

    @property (nonatomic, assign) CGFloat cb_CenterX;

    @property (nonatomic, assign) CGFloat cb_CenterY;

    @end

    #import "CBSegmentView.h"

    @interface CBSegmentView ()<UIScrollViewDelegate>

    /**

     *  configuration.

     */

    {

        CGFloat_HeaderH;

        UIColor*_titleColor;

        UIColor*_titleSelectedColor;

        CBSegmentStyle_SegmentStyle;

        CGFloat_titleFont;

    }

    /**

     *  The bottom red slider.

     */

    @property (nonatomic, weak) UIView *slider;

    @property (nonatomic, strong) NSMutableArray *titleWidthArray;

    @property (nonatomic, weak) UIButton *selectedBtn;

    @end

    #define CBColorA(r,g,b,a) [UIColor colorWithRed:(r)/255.0green:(g)/255.0blue:(b)/255.0alpha:a]

    #define CBScreenH [UIScreen mainScreen].bounds.size.height

    #define CBScreenW [UIScreen mainScreen].bounds.size.width

    @implementation CBSegmentView

    #pragma mark - delayLoading

    - (NSMutableArray *)titleWidthArray {

        if (!_titleWidthArray) {

            _titleWidthArray = [NSMutableArray new];

        }

        return _titleWidthArray;

    }

    #pragma mark - Initialization

    - (instancetype)initWithFrame:(CGRect)frame

    {

        self= [superinitWithFrame:frame];

        if(self) {

            self.bounces=NO;

            self.showsHorizontalScrollIndicator = NO;

            self.showsVerticalScrollIndicator = NO;

            self.layer.borderColor=CBColorA(204,204,204,1).CGColor;

            self.layer.borderWidth = 0.5;

            _HeaderH= frame.size.height;

            _SegmentStyle = CBSegmentStyleSlider;

            _titleColor = [UIColor darkTextColor];

            _titleSelectedColor=CBColorA(199,13,23,1);

            _titleFont=15;

        }

        return self;

    }

    - (void)setTitleArray:(NSArray *)titleArray {

        [self setTitleArray:titleArray withStyle:0];

    }

    - (void)setTitleArray:(NSArray *)titleArraywithStyle:(CBSegmentStyle)style {

        [self setTitleArray:titleArray titleFont:0 titleColor:nil titleSelectedColor:nil withStyle:style];

    }

    - (void)setTitleArray:(NSArray *)titleArray

                titleFont:(CGFloat)font

               titleColor:(UIColor*)titleColor

       titleSelectedColor:(UIColor*)selectedColor

                withStyle:(CBSegmentStyle)style {

    //    set style

        if(style !=0) {

            _SegmentStyle= style;

        }

        if(font !=0) {

            _titleFont= font;

        }

        if(titleColor) {

            _titleColor= titleColor;

        }

        if(selectedColor) {

            _titleSelectedColor= selectedColor;

        }

        if (style == CBSegmentStyleSlider) {

            UIView*slider = [[UIViewalloc]init];

            slider.frame=CGRectMake(0,_HeaderH-2,0,2);

            slider.backgroundColor=_titleSelectedColor;

            [selfaddSubview:slider];

            self.slider= slider;

        }

        [self.titleWidthArray removeAllObjects];

        CGFloattotalWidth =15;

        CGFloatbtnSpace =15;

        for(NSIntegeri =0; i

    //        cache title width

            CGFloattitleWidth = [selfwidthOfTitle:titleArray[i]titleFont:_titleFont];

            [self.titleWidthArray addObject:[NSNumber numberWithFloat:titleWidth]];

    //        creat button

            UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

            [selfaddSubview:btn];

            CGFloatbtnW = titleWidth+20;

            btn.frame=  CGRectMake(totalWidth,0.5, btnW,_HeaderH-0.5-2);

            btn.contentMode = UIViewContentModeCenter;

            btn.titleLabel.textAlignment = NSTextAlignmentCenter;

            btn.tag= i;

            [btnsetTitle:titleArray[i] forState:UIControlStateNormal];

            [btnsetTitleColor:_titleColor forState:UIControlStateNormal];

            [btnsetTitleColor:_titleSelectedColor forState:UIControlStateSelected];

            [btn.titleLabel setFont:[UIFont systemFontOfSize:_titleFont]];

            [btnaddTarget:self action:@selector(titleButtonSelected:) forControlEvents:UIControlEventTouchUpInside];

            totalWidth = totalWidth+btnW+btnSpace;

            if(i ==0) {

                btn.selected=YES;

                self.selectedBtn= btn;

                if (_SegmentStyle == CBSegmentStyleSlider) {

                    self.slider.cb_Width= titleWidth;

                    self.slider.cb_CenterX= btn.cb_CenterX;

                }else if (_SegmentStyle == CBSegmentStyleZoom) {

                    self.selectedBtn.transform = CGAffineTransformMakeScale(1.3, 1.3);

                }

            }

        }

        totalWidth = totalWidth+btnSpace;

        self.contentSize=CGSizeMake(totalWidth,0);

    }

    //  button click

    - (void)titleButtonSelected:(UIButton *)btn {

        self.selectedBtn.selected = NO;

        btn.selected=YES;

        if (_SegmentStyle == CBSegmentStyleSlider) {

            NSNumber* sliderWidth =self.titleWidthArray[btn.tag];

            [UIView animateWithDuration:0.2 animations:^{

                self.slider.cb_Width= sliderWidth.floatValue;

                self.slider.cb_CenterX = btn.cb_CenterX;

            }];

        }else if (_SegmentStyle == CBSegmentStyleZoom) {

            [UIView animateWithDuration:0.2 animations:^{

                self.selectedBtn.transform = CGAffineTransformIdentity;

                btn.transform = CGAffineTransformMakeScale(1.3, 1.3);

            }];

        }

        self.selectedBtn= btn;

        CGFloatoffsetX = btn.cb_CenterX-self.frame.size.width*0.5;

        if(offsetX<0) {

            offsetX =0;

        }

        if (offsetX>self.contentSize.width-self.frame.size.width) {

            offsetX =self.contentSize.width-self.frame.size.width;

        }

        [self setContentOffset:CGPointMake(offsetX, 0) animated:YES];

        if (self.titleChooseReturn) {

            self.titleChooseReturn(btn.tag);

        }

    }

    //  cache title width

    - (CGFloat)widthOfTitle:(NSString*)titletitleFont:(CGFloat)titleFont {

        CGSize titleSize = [title boundingRectWithSize:CGSizeMake(MAXFLOAT, _HeaderH-2)

                                                options:NSStringDrawingUsesLineFragmentOrigin

                                             attributes:[NSDictionary dictionaryWithObject:[UIFont systemFontOfSize:titleFont] forKey:NSFontAttributeName]

                                                context:nil].size;

        returntitleSize.width;

    }

    @end

    @implementationUIView(CBViewFrame)

    - (void)setCb_Width:(CGFloat)cb_Width {

        CGRectframe =self.frame;

        frame.size.width= cb_Width;

        self.frame= frame;

    }

    - (CGFloat)cb_Width {

        return self.frame.size.width;

    }

    - (void)setCb_Height:(CGFloat)cb_Height {

        CGRectframe =self.frame;

        frame.size.height= cb_Height;

        self.frame= frame;

    }

    - (CGFloat)cb_Height {

        return self.frame.size.height;

    }

    - (void)setCb_CenterX:(CGFloat)cb_CenterX {

        CGPointcenter =self.center;

        center.x= cb_CenterX;

        self.center= center;

    }

    - (CGFloat)cb_CenterX {

        return self.center.x;

    }

    - (void)setCb_CenterY:(CGFloat)cb_CenterY {

        CGPointcenter =self.center;

        center.y= cb_CenterY;

        self.center= center;

    }

    - (CGFloat)cb_CenterY {

        return self.center.y;

    }

    @end

    相关文章

      网友评论

          本文标题:CBSegmentView

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