【问题标题】:Customize UISLider to change the color after the thumb is dragged自定义 UISLider 拖动拇指后改变颜色
【发布时间】:2013-04-24 14:54:58
【问题描述】:

我有这种类型的自定义UISlider 我已经实现了,看起来像这样:

它的特点是你不能把它拖到它的初始拇指位置的左边。

但是当你把它拖到右边时,它应该像这样改变路径的颜色,让左边的颜色保持原样,并为它走过的路径着色:

我只知道UISlider-MinimumTrackImageMaximumTrackImage这两个属性分别负责左右两边的句柄。

如何实现这种奇怪的行为?有任何想法吗?谢谢!

【问题讨论】:

  • 我不知道这是否真的有效,但尝试创建一个新的自定义最小轨道图像,它的左边是旧颜色(与初始拇指值一样宽),新颜色在右边(只有两个像素宽)。然后调用resizableImageWithCapInsets 并使用与拇指值匹配的left 值和right 值1。
  • @rmaddy 这是一个很棒的想法,但是如何将拇指值转换为像素?
  • 将拇指值转换为百分比(0.0 到 1.0)。乘以 UISlider 的宽度。
  • @rmaddy 这个想法很棒,但不幸的是我无法像我尝试的那样努力实现它。不过,我会继续寻找这个任务的答案。

标签: ios cocoa-touch uislider


【解决方案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,我会收到图形上下文错误,因此如果该值小于 0.01,viewDidAppear 方法中的 if 语句将使用不同的单色图像。

【讨论】:

  • @rmaddy,感谢您的想法,这是一个有趣的工作。我猜有比我在这里使用隐藏在当前视图下的图像视图的方式更好的方法来获取图像。您知道如何从“屏幕外视图”获取图像吗?
  • 这是个好主意,我会尝试一下,稍后再报告结果!
  • 效果非常好!非常感谢这个惊人的解决方案!
【解决方案2】:

你可以用这个

//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];  

这是 raywenderlich 的 tutorial 很好

【讨论】:

  • 已经在使用它们。这些方法将如何让我保持图像的部分原样并更改拇指路径的颜色?
  • 我认为我的问题已经足够清楚地说明了 - 追踪拇指的路径并将绿色图像放置在它所在的位置。
  • 在rayWenderlich代码中,移动后左右路径的变化
  • 它会让左边的路径变成双色吗?
  • 拜托,先生,如果您不明白这个问题,请不要再傻了,请删除您的答案,再也不要回来,好吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多