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

双向区间选择器

作者: 新生的光明 | 来源:发表于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