я был в состоянии осуществить это с помощью следующего кода. Трудная часть, чтобы выяснить, как установить начальное изображение на основе начального значения ползунка. Я сделал это, создав изображение шириной 4 пикселя, а левый 2 пикселя - начальный левый цвет, а правый 2 пикселя - цвет, который вы хотите после перетаскивания. В основном, я растянул это изображение (только слева), чтобы заполнить изображение, затем получил это изображение с помощью UIGraphicsGetImageFromCurrentImageContext(). Затем я создаю еще одно растяжимое изображение с этим изображением с растяжением только справа.
#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>
@interface ViewController()
@property (weak,nonatomic) IBOutlet UISlider *slider;
@property (nonatomic) CGFloat previousValue;
@end
@implementation ViewController
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
self.previousValue = self.slider.value;
if (self.slider.value > .01) {
UIImage *newImage = [self imageStretchedOnLeft];
UIImage *rightStretchImage = [newImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, newImage.size.width -2, 0, 0) resizingMode:UIImageResizingModeStretch];
[self.slider setMinimumTrackImage:rightStretchImage forState:UIControlStateNormal];
}else{
[self.slider setMinimumTrackImage:[UIImage imageNamed:@"OneColor.png"] forState:UIControlStateNormal];
}
}
-(IBAction)sliderMoved:(UISlider *)slider {
if (slider.value < self.previousValue) {
slider.value = self.previousValue;
}
self.previousValue = slider.value;
}
- (UIImage *)imageStretchedOnLeft {
UIImage *image = [UIImage imageNamed:@"TwoColor.png"]; // 4 pixel wide 1 pixel high image. Left 2 pixels are original track color, right two are new drag color
UIImage *cappedImage = [image resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 2)];
UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.slider.frame.size.width * (self.slider.value/self.slider.maximumValue), self.slider.frame.size.height)];
iv.image = cappedImage;
[self.view insertSubview:iv belowSubview:self.view];
UIGraphicsBeginImageContextWithOptions(iv.frame.size, YES, [[UIScreen mainScreen] scale]);
[iv.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[iv removeFromSuperview];
return img;
}
я получаю ошибку графического контекста, если значение ползунка является 0, так что, если оператор в методе viewDidAppear использует другое один цветное изображение, если это значение меньше 0,01.
Я не знаю, действительно ли это будет работать, но попробуйте создать новое пользовательское минимальное изображение трека, имеющее старый цвет слева (и столь же широкий, как и начальное значение большого пальца), и новый цвет справа (всего два пикселей в ширину). Затем вызовите 'resizableImageWithCapInsets' значение' left', соответствующее значению большого пальца, и значение 'right' равно 1. – rmaddy
@rmaddy Это потрясающая идея, но как вы передаете значение большого пальца в пиксели? –
Преобразуйте значение большого пальца в проценты (от 0.0 до 1.0). Умножьте это на ширину 'UISlider'. – rmaddy