2013-04-24 1 views
1

У меня есть этот тип пользовательских UISlider я реализованного который выглядит следующим образом: enter image description hereНастройка UISLider, чтобы изменить цвет после того, как большой палец тащили

Особенностью этого является то, что вы не можете перетащить его на слева от его начального положения большого пальца.

Но когда вы перетащите его вправо, он должен изменить цвет пути, как это оставляя цвет на левой, как это было и окрашивая путь он пройденное:

enter image description here

Я только знают о двух свойствах UISlider - MinimumTrackImage и MaximumTrackImage, которые отвечают за правую и левую стороны рукоятки.

Как реализовать это странное поведение? Есть идеи? Благодаря!

+0

Я не знаю, действительно ли это будет работать, но попробуйте создать новое пользовательское минимальное изображение трека, имеющее старый цвет слева (и столь же широкий, как и начальное значение большого пальца), и новый цвет справа (всего два пикселей в ширину). Затем вызовите 'resizableImageWithCapInsets' значение' left', соответствующее значению большого пальца, и значение 'right' равно 1. – rmaddy

+0

@rmaddy Это потрясающая идея, но как вы передаете значение большого пальца в пиксели? –

+0

Преобразуйте значение большого пальца в проценты (от 0.0 до 1.0). Умножьте это на ширину 'UISlider'. – rmaddy

ответ

1

я был в состоянии осуществить это с помощью следующего кода. Трудная часть, чтобы выяснить, как установить начальное изображение на основе начального значения ползунка. Я сделал это, создав изображение шириной 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.

+0

@rmaddy, спасибо за идею, это было весело для работы. Я предполагаю, что есть лучший способ получить изображение, чем то, как я делаю это здесь, с видом изображения, скрытым под текущим представлением. Вы знаете, как получить изображение из «вне экрана»? – rdelmar

+0

Это отличная идея, я попробую и расскажу о результатах позже! –

+0

Он отлично поработал! Большое спасибо за это замечательное решение! –

-1

Вы можете использовать этот

//code for slider 
UIImage *minImage = [[UIImage imageNamed:@"slider_minimum.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 0)]; 
UIImage *maxImage = [[UIImage imageNamed:@"slider_maximum.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 0)]; 
UIImage *thumbImage = [UIImage imageNamed:@"thumb.png"]; 

[[UISlider appearance] setMaximumTrackImage:maxImage forState:UIControlStateNormal]; 
[[UISlider appearance] setMinimumTrackImage:minImage forState:UIControlStateNormal]; 
[[UISlider appearance] setThumbImage:thumbImage forState:UIControlStateNormal]; 

Вот хороший tutorial из raywenderlich

+0

Я ** уже ** использую их. Как эти методы позволят мне сохранить ** часть изображения, как было, и изменить цвет пути большого пальца? –

+0

Что вы хотите сделать? – Rajneesh071

+0

Я думаю, что мой вопрос говорит об этом достаточно ясно - проследите путь большого пальца и поместите зеленое изображение туда, куда оно пошло. –

Смежные вопросы