美文网首页
双向区间选择器

双向区间选择器

作者: 新生的光明 | 来源:发表于2023-05-30 10:58 被阅读0次
    Untitled.gif

    废话不说,直接上代码

    @interface xx : UIView
    
    @property (nonatomic,assign) NSInteger toNum;
    @property (nonatomic,assign) NSInteger fromNum;
    
    - (void)refreshView:(NSInteger)from to:(NSInteger)to;
    
    @end
    
    @interface xx()
    
    @property (nonatomic, strong)UIView *progressView;
    @property (nonatomic, strong)UIImageView *leftHandImageView;
    @property (nonatomic, strong)UIImageView *rightHandImageView;
    @property (nonatomic, strong)NSMutableArray *lineArray;
    @property (nonatomic, assign)CGFloat space;
    
    @end
    
    @implementation xx
    - (instancetype)initWithFrame:(CGRect)frame {
        self = [super initWithFrame:frame];
        if (self) {
            self.backgroundColor = [UIColor whiteColor];
            
            [self createSubviews];
        }
        return self;
    }
    
    - (void)createSubviews {
        
        CGFloat width = self.frame.size.width;
        CGFloat lineWidth = 1;
        self.space = (width - lineWidth * 23) * 1.0 / 22;
        UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 35, width, 4)];
        lineView.backgroundColor = [UIColor grayColor];
        [self addSubview:lineView];
        
        self.lineArray = [NSMutableArray array];
        for (NSInteger i=0; i <= 110; i+=5) {
            
            UIView *spaceView = [[UIView alloc] init];
            spaceView.backgroundColor = [UIColor redColor];
            [self addSubview:spaceView];
            [spaceView mas_makeConstraints:^(MASConstraintMaker *make) {
                make.left.mas_equalTo(i/5*(self.space+lineWidth));
                make.width.mas_equalTo(lineWidth);
                make.height.mas_equalTo(4);
                make.bottom.equalTo(lineView.mas_top).offset(-2);
            }];
            if (i%2 != 0) {
                spaceView.hidden = YES;
            }
            [self.lineArray addObject:spaceView];
            if (i >= 10 && i <=100 && i%2 == 0) {
                UILabel *label = UILabel.new;
                label.text = @(i).stringValue;
                label.textAlignment = NSTextAlignmentCenter;
                label.font = [UIFont systemFontOfSize:10];
                label.textColor = UIColor.orangeColor;
                [self addSubview:label];
                
                [label mas_makeConstraints:^(MASConstraintMaker *make) {
                    make.centerX.equalTo(spaceView.mas_centerX);
                    make.bottom.equalTo(spaceView.mas_top).offset(-4);
                }];
            }
            
        }
        [self layoutIfNeeded];
        
        UIView *firstView = self.lineArray.firstObject;
        UIView *lastView = self.lineArray.lastObject;
        
        [self addSubview:self.progressView];
        [self addSubview:self.leftHandImageView];
        [self addSubview:self.rightHandImageView];
        
        
        self.leftHandImageView.frame = CGRectMake(0, lineView.frame.origin.y+lineView.frame.size.height+6, 18, 22);
        self.leftHandImageView.center = CGPointMake(firstView.center.x, self.leftHandImageView.center.y);
        self.rightHandImageView.frame = CGRectMake(0, lineView.frame.origin.y+lineView.frame.size.height+6, 18, 22);
        self.rightHandImageView.center = CGPointMake(lastView.center.x, self.rightHandImageView.center.y);
        
        self.progressView.frame = CGRectMake(0, 0, 100, 4);
        self.progressView.center = CGPointMake(self.progressView.center.x, lineView.center.y);
        CGRect progressRect = CGRectMake(self.leftHandImageView.center.x, self.progressView.frame.origin.y, self.rightHandImageView.center.x - self.leftHandImageView.center.x, 4);
        self.progressView.frame = progressRect;
        self.fromNum = 0;
        self.toNum = 110;
        
    }
    
    - (void)refreshView:(NSInteger)from to:(NSInteger)to {
        self.fromNum = from;
        self.toNum = to;
        UIView *firstView = [self getLine:from];
        UIView *lastView = [self getLine:to];
        self.leftHandImageView.center = CGPointMake(firstView.center.x, self.leftHandImageView.center.y);
        self.rightHandImageView.center = CGPointMake(lastView.center.x, self.rightHandImageView.center.y);
        CGRect progressRect = CGRectMake(self.leftHandImageView.center.x, self.progressView.frame.origin.y, self.rightHandImageView.center.x - self.leftHandImageView.center.x, 4);
        self.progressView.frame = progressRect;
    }
    
    
    -(void)leftHandMove:(UIPanGestureRecognizer *)pan{
        UIView *firstView = self.lineArray.firstObject;
        UIView *lastView = self.lineArray.lastObject;
        CGPoint point = [pan translationInView:self.leftHandImageView];
        CGFloat x = self.leftHandImageView.center.x + point.x;
        if(x > lastView.frame.origin.x + lastView.frame.size.width){
            x = lastView.frame.origin.x + lastView.frame.size.width;
        }else if (x < firstView.frame.origin.x){
            x = firstView.frame.origin.x;
        }
        if (self.rightHandImageView.center.x - x <= self.space) {
            x = self.rightHandImageView.center.x - self.space;
        }
        self.leftHandImageView.center = CGPointMake(ceilf(x),  self.leftHandImageView.center.y);
        
        [pan setTranslation:CGPointZero inView:self];
        if (pan.state == UIGestureRecognizerStateEnded) {
            [self changeHandImageViewCenter:self.leftHandImageView point:ceilf(x)];
        }
    
        CGRect progressRect = CGRectMake(self.leftHandImageView.center.x, self.progressView.frame.origin.y, self.rightHandImageView.center.x - self.leftHandImageView.center.x, 4);
        self.progressView.frame = progressRect;
    }
    
    -(void)rightHandMove:(UIPanGestureRecognizer *)pan{
        UIView *firstView = self.lineArray.firstObject;
        UIView *lastView = self.lineArray.lastObject;
        CGPoint point = [pan translationInView:self.rightHandImageView];
        CGFloat x = self.rightHandImageView.center.x + point.x;
        if(x > lastView.frame.origin.x + lastView.frame.size.width){
            x = lastView.frame.origin.x + lastView.frame.size.width;
        }else if (x < firstView.frame.origin.x){
            x = firstView.frame.origin.x;
        }
        if (x - self.leftHandImageView.center.x <= self.space) {
            x = self.leftHandImageView.center.x + self.space;
        }
        self.rightHandImageView.center = CGPointMake(ceilf(x), self.rightHandImageView.center.y);
        [pan setTranslation:CGPointZero inView:self];
        if (pan.state == UIGestureRecognizerStateEnded) {
            [self changeHandImageViewCenter:self.rightHandImageView point:ceilf(x)];
        }
        CGRect progressRect = CGRectMake(self.leftHandImageView.center.x, self.progressView.frame.origin.y, self.rightHandImageView.center.x - self.leftHandImageView.center.x, 4);
        self.progressView.frame = progressRect;
    }
    
    - (void)changeHandImageViewCenter:(UIView *)handView point:(CGFloat)x {
        UIView *beforeView = self.lineArray.firstObject;
        for (UIView *lineView in self.lineArray) {
            if (x >= beforeView.frame.origin.x &&
                x <= lineView.frame.origin.x) {
                UIView *centerView = beforeView;
                if (lineView.frame.origin.x - x < x - beforeView.frame.origin.x) {
                    if (handView == self.leftHandImageView) {
                        if (lineView.center.x < self.rightHandImageView.center.x) {
                            centerView = lineView;
                        }
                    } else {
                        if (lineView.center.x > self.leftHandImageView.center.x) {
                            centerView = lineView;
                        }
                    }
                    
                }
                handView.center = CGPointMake(centerView.center.x,  handView.center.y);
                if (handView == self.leftHandImageView) {
                    self.fromNum = [self getNumber:centerView];
                } else {
                    self.toNum = [self getNumber:centerView];
                }
                break;
            }
            beforeView = lineView;
        }
    }
    
    - (NSInteger)getNumber:(UIView *)lineV {
        
        return 5 * [self.lineArray indexOfObject:lineV];
    }
    
    - (UIView *)getLine:(NSInteger)number {
        return [self.lineArray objectAtIndex:number/5];
    }
    
    #pragma mark - lz
    - (UIView *)progressView {
        if (!_progressView) {
            _progressView = [UIView new];
            _progressView.backgroundColor = UIColor.blueColor;
            
            UIView *leftView = [UIView new];
            leftView.backgroundColor = UIColor.blueColor;
            [_progressView addSubview:leftView];
            
            UIView *rightView = [UIView new];
            rightView.backgroundColor = UIColor.blueColor;
            [_progressView addSubview:rightView];
            
            [leftView mas_makeConstraints:^(MASConstraintMaker *make) {
                make.width.mas_equalTo(2);
                make.height.mas_equalTo(8);
                make.left.equalTo(_progressView.mas_left);
                make.centerY.equalTo(_progressView.mas_centerY);
            }];
            
            [rightView mas_makeConstraints:^(MASConstraintMaker *make) {
                make.width.mas_equalTo(2);
                make.height.mas_equalTo(8);
                make.right.equalTo(_progressView.mas_right);
                make.centerY.equalTo(_progressView.mas_centerY);
            }];
        }
        return _progressView;
    }
    
    - (UIImageView *)leftHandImageView {
        if (!_leftHandImageView) {
            _leftHandImageView = [[UIImageView alloc] init];
            [_leftHandImageView setImage:[UIImage imageNamed:@"xx"]];
            UIPanGestureRecognizer *leftPanRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(leftHandMove:)];
            [leftPanRecognizer setMinimumNumberOfTouches:1];
            [leftPanRecognizer setMaximumNumberOfTouches:1];
            [_leftHandImageView setUserInteractionEnabled:YES];
            [_leftHandImageView addGestureRecognizer:leftPanRecognizer];
        }
        
        return _leftHandImageView;
    }
    
    - (UIImageView *)rightHandImageView {
        if (!_rightHandImageView) {
            _rightHandImageView = [[UIImageView alloc] init];
            [_rightHandImageView setImage:[UIImage imageNamed:@"xx"]];
            UIPanGestureRecognizer *rightPanRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(rightHandMove:)];
            [rightPanRecognizer setMinimumNumberOfTouches:1];
            [rightPanRecognizer setMaximumNumberOfTouches:1];
            [_rightHandImageView setUserInteractionEnabled:YES];
            [_rightHandImageView addGestureRecognizer:rightPanRecognizer];
        }
        
        return _rightHandImageView;
    }
    @end
    

    相关文章

      网友评论

          本文标题:双向区间选择器

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