Вот простая версия того, что вы описываете.
Это "просто" в том смысле, что я не стал пытаться добавить затенение и другие тонкости. Но это легко построить, и вы можете настроить его, чтобы нарисовать более тонким способом, если хотите. Например, вы можете создать собственное изображение и использовать его как большой палец слайдера.
На самом деле это подкласс UISlider, лежащий поверх подкласса UIView (MyTherm), который рисует термометр, плюс две метки UILabel, которые рисуют числа.
Подкласс UISlider исключает встроенную дорожку, так что термометр позади нее просвечивает. Но большой палец (ручка) UISlider по-прежнему можно перетаскивать в обычном режиме, и вы можете установить его на собственное изображение, получить событие Value Changed, когда пользователь перетаскивает его, и так далее. Вот код для подкласса UISlider, который исключает собственную дорожку:
- (CGRect)trackRectForBounds:(CGRect)bounds {
CGRect result = [super trackRectForBounds:bounds];
result.size.height = 0;
return result;
}
Термометр является экземпляром пользовательского подкласса UIView, MyTherm. Я создал его в перо, снял флажок с Opaque и дал цвет фона Clear Color. У него есть свойство value
, поэтому он знает, сколько нужно заполнить термометром. Вот его drawRect:
код:
- (void)drawRect:(CGRect)rect {
CGContextRef c = UIGraphicsGetCurrentContext();
[[UIColor whiteColor] set];
CGFloat ins = 2.0;
CGRect r = CGRectInset(self.bounds, ins, ins);
CGFloat radius = r.size.height / 2.0;
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, CGRectGetMaxX(r) - radius, ins);
CGPathAddArc(path, NULL, radius+ins, radius+ins, radius, -M_PI/2.0, M_PI/2.0, true);
CGPathAddArc(path, NULL, CGRectGetMaxX(r) - radius, radius+ins, radius, M_PI/2.0, -M_PI/2.0, true);
CGPathCloseSubpath(path);
CGContextAddPath(c, path);
CGContextSetLineWidth(c, 2);
CGContextStrokePath(c);
CGContextAddPath(c, path);
CGContextClip(c);
CGContextFillRect(c, CGRectMake(r.origin.x, r.origin.y, r.size.width * self.value, r.size.height));
}
Чтобы изменить значение термометра, измените значение value
экземпляра MyTherm на число от 0 до 1 и попросите его перерисовать себя с помощью setNeedsDisplay
.