iOS 实现金融选金额的游标尺

匿名 (未验证) 提交于 2019-12-03 00:37:01

最近产品看别的app有游标尺选金额,要我们也加上,好吧,开干!先看看效果:

首先我要可以设置最大值、最小值、和默认指向的值:

@property (nonatomic, assign) double minValue;      // 最小值,默认为0 @property (nonatomic, assign) double maxValue;      // 最大值,必需设置 @property (nonatomic, assign) double defaultValue;  // 默认值,默认为0

初始化试图:

- (instancetype)initWithFrame:(CGRect)frame {     self = [super initWithFrame:frame];     if (self) {         _scrollWidth = kScreenWidth;         self.backgroundColor = [UIColor whiteColor];         [self addSubview:self.scrollView];         [self addSubview:self.textField];         [self addSubview:self.markLine];         [self addSubview:self.bottomLine];         _minValue = 0;     //设置默认初始值     }     return self; }

难点是根据数值画刻度:

- (void)createIndicator{     for (NSUInteger i = self.minValue, j = 0; i <= self.maxValue; i+=kMinScale, j++) {         _scrollWidth += kPadding;         [self drawSegmentWithValue:i idx:j];     }     self.scrollView.contentSize = CGSizeMake(_scrollWidth-kPadding, CGRectGetHeight(self.frame)); }  - (void)drawSegmentWithValue:(NSUInteger)value idx:(NSUInteger)idx {     UIBezierPath *path = [UIBezierPath bezierPath];     CGFloat x = kScreenWidth*0.5 + kPadding*idx;     [path moveToPoint:CGPointMake(x, CGRectGetHeight(self.frame)-5)];      if (value % (kMinScale*10) == 0 || value == _minValue) { //每10个刻度,do something         [path addLineToPoint:CGPointMake(x, CGRectGetHeight(self.frame)-10-5-10)];         UILabel *numLabel = [[UILabel alloc] initWithFrame:CGRectMake(x-50*0.5, CGRectGetHeight(self.frame)-20-10-5-5, 50, 10)];         numLabel.font = [UIFont systemFontOfSize:12];         numLabel.textAlignment = NSTextAlignmentCenter;         numLabel.textColor = [UIColor redColor];         numLabel.text = [NSString stringWithFormat:@"%ld", value];         [self.scrollView addSubview:numLabel];     } else if (value % (kMinScale*2) != 0) {   //每2个刻度,do something         [path addLineToPoint:CGPointMake(x, CGRectGetHeight(self.frame)-10)];     } else{         [path addLineToPoint:CGPointMake(x, CGRectGetHeight(self.frame)-10-5)];     }      CAShapeLayer *line = [[CAShapeLayer alloc] init];     line.lineWidth = 1;     line.strokeColor = [UIColor orangeColor].CGColor;     line.path = path.CGPath;      [self.scrollView.layer addSublayer:line]; } 

通过执行UIScrollViewDelegate实时显示滚到的数值

#pragma mark - UIScrollViewDelegate - (void)scrollViewDidScroll:(UIScrollView *)scrollView {     CGFloat num = scrollView.contentOffset.x;     double value = (num / kPadding) * kMinScale + self.minValue;     if (value < self.minValue) {         value = self.minValue;     }else if (value > self.maxValue) {         value = self.maxValue;     }      self.textField.text = [NSString stringWithFormat:@"%.f", value]; }  - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{     CGFloat num = scrollView.contentOffset.x;     NSInteger value = (num / kPadding) * kMinScale + self.minValue;     value =  value - value % kMinScale;     [self.scrollView setContentOffset:CGPointMake((value-_minValue)/kMinScale*kPadding, 0) animated:YES];     self.textField.text = [NSString stringWithFormat:@"%ld", value]; }  - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{     if(!decelerate){         //OK,真正停止了,do something         CGFloat num = scrollView.contentOffset.x;         NSInteger value = (num / kPadding) * kMinScale + self.minValue;         value =  value - value % kMinScale;         [self.scrollView setContentOffset:CGPointMake((value-_minValue)/kMinScale*kPadding, 0) animated:YES];         self.textField.text = [NSString stringWithFormat:@"%ld", value];     } }

通过实现UITextFieldDelegate代理方法实现数值修改,让游标尺滚动到对应的数值:

#pragma mark - UITextFieldDelegate - (BOOL)textFieldShouldReturn:(UITextField *)textField {     [self endEditing:YES];     return YES; }  - (void)textFieldDidEndEditing:(UITextField *)textField {     if (textField.text.doubleValue > self.maxValue) {         textField.text = [NSString stringWithFormat:@"%.f",self.maxValue];     }      [self.scrollView setContentOffset:CGPointMake((textField.text.doubleValue-_minValue)/kMinScale*kPadding, 0) animated:YES];     self.textField.text = textField.text; }  // 根据输入的数字变化 - (void)textDidChanged:(NSNotification *)info {     UITextField *textField = info.object;     NSString *text = textField.text;     if (textField.isEditing) {         self.scrollView.contentOffset = CGPointMake((text.doubleValue-_minValue)/kMinScale*kPadding, 0);         self.textField.text = text;     } }

细节处理:游标尺自动取整
一个简洁的游标尺,就实现了。这里将Demo:ZBRulerView献上,朋友请多指教。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!