双向滑动条

最近做项目,碰到一种双向滑动条,自己实现了一下,随便写一下思路,方便以后开发,避免重复写代码,以后粘贴就行了。封装了一下,代码如下:


#import <UIKit/UIKit.h>

typedef NSString* (^HLDoubleSlideViewSwitchStrBock)(CGFloat count);

@interface HLDoubleSlideView : UIView

@property(nonatomic,assign)CGFloat maxValue;
@property(nonatomic,assign)CGFloat minValue;
@property(nonatomic,assign)CGFloat currentLeftValue;
@property(nonatomic,assign)CGFloat currentRightValue;

//格式化显示文本
@property(nonatomic,copy)HLDoubleSlideViewSwitchStrBock block;

@end

源文件如下:

#import "HLDoubleSlideView.h"
#import "UIView+Add.h"

@interface HLDoubleSlideView ()<UIGestureRecognizerDelegate>

@property(nonatomic,strong)UIImageView *leftImageView;
@property(nonatomic,strong)UIImageView *rightImageView;
@property(nonatomic,strong)UILabel *leftLabel;
@property(nonatomic,strong)UILabel *rightLabel;

@property(nonatomic,strong)UIButton *leftBtn;
@property(nonatomic,strong)UIButton *rightBtn;

@property(nonatomic,assign)CGFloat leftBtnOrgx;
@property(nonatomic,assign)CGFloat rightBtnOrgx;

@end

@implementation HLDoubleSlideView

-(id)init
{
    if (self = [super init]) {
        [self setupUI];
    }
    return self;
}

-(void)setupUI
{
    
    _leftImageView = [[UIImageView alloc] init];
    _leftImageView.image = [UIImage imageNamed:@"progressImage"];
    _leftImageView.frame = CGRectMake(0, 5, 60, 40);
    [self addSubview:_leftImageView];
    
    _leftLabel = [[UILabel alloc] initWithFrame:_leftImageView.bounds];
    _leftLabel.backgroundColor = [UIColor clearColor];
    _leftLabel.font = [UIFont systemFontOfSize:13];
    _leftLabel.textAlignment = NSTextAlignmentCenter;
    _leftLabel.textColor = [UIColor whiteColor];
    [_leftImageView addSubview:_leftLabel];
    
    _rightImageView = [[UIImageView alloc] init];
    _rightImageView.image = [UIImage imageNamed:@"progressImage"];
    _rightImageView.frame = CGRectMake(0, 5, 60, 40);
    [self addSubview:_rightImageView];
    
    _rightLabel = [[UILabel alloc] initWithFrame:_rightImageView.bounds];
    _rightLabel.backgroundColor = [UIColor clearColor];
    _rightLabel.font = [UIFont systemFontOfSize:13];
    _rightLabel.textAlignment = NSTextAlignmentCenter;
    _rightLabel.textColor = [UIColor whiteColor];
    [_rightImageView addSubview:_rightLabel];
    
    _leftBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    _leftBtn.frame = CGRectMake(0, 50, 20,20);
    _leftBtn.backgroundColor = [UIColor blueColor];
    _leftBtn.layer.cornerRadius = 10;
    [self addSubview:_leftBtn];
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureAction:)];
    panGesture.delegate = self;
    [_leftBtn addGestureRecognizer:panGesture];
    
    _leftImageView.centerX = _leftBtn.centerX;
    
    _rightBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    _rightBtn.backgroundColor = [UIColor blueColor];
    _rightBtn.frame = CGRectMake(240, 50, 20, 20);
    _rightBtn.layer.cornerRadius = 10;
    panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureAction:)];
    panGesture.delegate = self;
    [_rightBtn addGestureRecognizer:panGesture];
    _rightImageView.centerX = _rightBtn.centerX;


    [self addSubview:_rightBtn];
    
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    return YES;
}

-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    NSLog(@"doubleView hitTest");
    return [super hitTest:point withEvent:event];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSLog(@"began");
    [super touchesBegan:touches withEvent:event];
}

-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSLog(@"move");
    [super touchesMoved:touches withEvent:event];
}


-(void)layoutSubviews
{
    
    CGFloat centenX = (_currentLeftValue - _minValue) * (self.bounds.size.width - 20)/(_maxValue - _minValue) + 10;
    _leftBtn.centerX = centenX;
    
    if (_currentLeftValue != 0) {
        CGFloat centenX = (_currentRightValue - _minValue) * (self.bounds.size.width - 20) / (_maxValue - _minValue) + 10;
        _rightBtn.centerX = centenX;


    }
    else
    {
        _rightBtn.centerX = self.bounds.size.width - 10;

    }
   
    
    _leftImageView.centerX = _leftBtn.centerX;
    _rightImageView.centerX = _rightBtn.centerX;
    if (_block) {
        _leftLabel.text = _block(_currentLeftValue);
        _rightLabel.text = _block(_currentRightValue);
    }
}

-(void)tapGestureAction:(UIPanGestureRecognizer*)panGesture
{
    UIView *vw = panGesture.view;
    
    CGPoint transPoint = [panGesture translationInView:self];
    NSLog(@"x:%lf,y:%lf",transPoint.x,transPoint.y);
    
    switch (panGesture.state) {
        case UIGestureRecognizerStateBegan:
        {
            if ([vw isEqual:_leftBtn])
            {
                _leftBtnOrgx = _leftBtn.orgX;
                NSLog(@"拖拽左边按钮");
                
            }
            else if([vw isEqual:_rightBtn])
            {
                _rightBtnOrgx = _rightBtn.orgX;
                NSLog(@"拖拽右边按钮");
            }

        }
            break;
        case UIGestureRecognizerStateChanged:
        {
            
            if ([vw isEqual:_leftBtn])
            {
                
                CGFloat orginX = _leftBtn.orgX;
                _leftBtn.orgX = _leftBtnOrgx + transPoint.x;
                if (_leftBtn.orgX < 0) {
                    _leftBtn.orgX = 0;
                }
                else if(_leftBtn.orgX >= _rightBtn.orgX - 20)
                {
                    _leftBtn.orgX = orginX;
                }
                 _leftImageView.centerX = _leftBtn.centerX;
            }
            else if([vw isEqual:_rightBtn])
            {
                CGFloat orginX = _rightBtn.orgX;
                _rightBtn.orgX = _rightBtnOrgx + transPoint.x;
                if (_rightBtn.orgX >= self.bounds.size.width - 20) {
                    _rightBtn.orgX = self.bounds.size.width - 20;
                }
                else if(_rightBtn.orgX <= _leftBtn.orgX + 20)
                {
                    _rightBtn.orgX = orginX;
                }
                 _rightImageView.centerX = _rightBtn.centerX;
            }
            
        }
            break;
        case UIGestureRecognizerStateEnded:
        {
            
        }
            break;
            
        default:
            break;
    }
    _currentLeftValue = _minValue + (_maxValue - _minValue) * ((_leftBtn.centerX - 10) / (self.bounds.size.width - 20));
    _currentRightValue = _minValue + (_maxValue - _minValue) * ((_rightBtn.centerX - 10) / (self.bounds.size.width - 20));
    if (_block) {
        _leftLabel.text = _block(_currentLeftValue);
        _rightLabel.text = _block(_currentRightValue);
    }
    
    
    NSLog(@"leftValue:%lf,rightValue:%lf",_currentLeftValue,_currentRightValue);
    
    [self setNeedsDisplay];
}

-(void)setCurrentLeftValue:(CGFloat)currentLeftValue
{
    _currentLeftValue = currentLeftValue;
    CGFloat centenX = (currentLeftValue - _minValue) * (self.bounds.size.width - 20)/(_maxValue - _minValue) + 10;
    _leftBtn.centerX = centenX;
    [self setNeedsDisplay];
}

-(void)setCurrentRightValue:(CGFloat)currentRightValue
{
    _currentRightValue = currentRightValue;
    CGFloat centenX = (_currentRightValue - _minValue) * (self.bounds.size.width - 20) / (_maxValue - _minValue) + 10;
    _rightBtn.centerX = centenX;
    [self setNeedsDisplay];

    
}

-(void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineWidth(context, 3);
    [[UIColor grayColor] setStroke];
    CGContextMoveToPoint(context, 0, 60);
    CGContextAddLineToPoint(context, self.bounds.size.width, 60);
    CGContextStrokePath(context);
    
    [[UIColor redColor] setStroke];
    CGContextMoveToPoint(context, _leftBtn.orgX + 10, 60);
    CGContextAddLineToPoint(context, _rightBtn.orgX,60);
    CGContextStrokePath(context);
    
}

@end

使用如下:

 HLDoubleSlideView *doubleSlideView = [[HLDoubleSlideView alloc] init];
    doubleSlideView.backgroundColor = [UIColor whiteColor];//HLColor(244, 244, 244);
    doubleSlideView.minValue = 1000;
    doubleSlideView.maxValue = 10000;
    doubleSlideView.block = ^NSString*(CGFloat count)
    {
        return [NSString stringWithFormat:@"%.0f元",count];
    };
    [self.view addSubview:doubleSlideView];
    
    doubleSlideView.frame = CGRectMake(60, 64, 250, 80);
    
    doubleSlideView.currentLeftValue = 1200;
    doubleSlideView.currentRightValue = 10000;

运行结果如下:

99.gif

demo:https://github.com/jiangtaidi/HLDoubleSlideView.git

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,598评论 25 707
  • 姓名:张汉超 公司:东莞耀升机电有限公司 组别:4月25-27日六项精进245期学员 【日精进打卡第115天】 【...
    张汉超阅读 129评论 0 0
  • 渺渺凌波,似故里江亭,几许烟水。 倦旅游丝,空负玉栏馨蕙。 黯淡点鬓吴霜,默念想、渡边佳丽。 水一方、远去千里,魂...
    刘小地阅读 295评论 15 56
  • 对于我来说,夜晚是我情绪最多变的时候 可能会哭泣 可能会疯狂 可能会沉默 我很佩服那些情能自控的人 我没那个能力 ...
    微笑o干净的像风阅读 185评论 2 1
  • 从元旦开始,我就无休止的投入一个项目中,一个真正属于自己的项目、属于业务关联的项目,当然除了过年的节假日,因为我白...
    黑暗中的一枚少女阅读 391评论 3 2