如何获取 UISlider 的默认 maximumTrackTintColor?

3

我想让一个UISlider的滑块在右边显示鲜艳色,左边显示暗淡色(交换颜色)

使用以下代码可以使滑块正确地显示鲜艳色:

mySlider.maximumTrackTintColor = self.view.tintColor

但我不知道如何获取灰色颜色以设置minimumTrackTintColor

我尝试过

mySlider.minimumTrackTintColor = mySlider.maximumTrackTintColor

之前我设置了maximumTrackTintColor,但这不起作用,因为如果没有设置自定义颜色,mySlider.maximumTrackTintColor返回空值。


我知道可以使用UIColor.lightGrayColor(),但默认颜色可能会在iOS的未来版本中更改,因此我想通过编程方式找出在UISlider中使用的颜色。 - Grezzo
你想改变颜色的饱和度吗? - Leo Dabus
默认情况下,滑块左侧的轨道为蓝色,右侧为灰色。我想让滑块左侧为灰色,右侧为蓝色。但我不仅仅想将其设置为灰色;我想找出 UISlider 使用的颜色并交换它们。 - Grezzo
我知道这很蠢,但也许你可以将控件旋转180度,并在委托回调中规范化值? - siejkowski
@siejkowski 我考虑过这个,但如果他们将来设置任何投影或类似的效果,它会看起来很奇怪。 - Grezzo
1个回答

3

好的,问题在于您正在尝试获取tintColor,但默认的vanilla iOS8非自定义UISlider并未使用tintColor来设置其颜色。

它使用imageForState。

因此,您可以使用slider.minimumTrackImageForState(UIControlState.Normal)!slider.maximumTrackImageForState(UIControlState.Normal)!方法获取图像。

但是,为了更加防御性,我建议尝试两种方法:

let minimumColor = slider.minimumTrackTintColor
let maximumColor = slider.maximumTrackTintColor
let minimumImage = slider.minimumTrackImageForState(UIControlState.Normal)
let maximumImage = slider.maximumTrackImageForState(UIControlState.Normal)

if let minimumColor = minimumColor {
    slider.maximumTrackTintColor = minimumColor
} else if let minimumImage = minimumImage {
    slider.setMaximumTrackImage(minimumImage, forState: .Normal)
} else {
    // ok, something has changed the big way, just fallback on some color you like
}

if let maximumColor = maximumColor {
    slider.minimumTrackTintColor = maximumColor
} else if let maximumImage = maximumImage {
    slider.setMinimumTrackImage(maximumImage, forState: .Normal)
} else {
    // ok, something has changed the big way, just fallback on some color you like
}

结果如下(上图为处理前,下图为处理后):

enter image description here


很好地发现它使用的是图像,而不是色调。但是你的代码似乎只是让轨道变粗了,而没有交换颜色。 - Grezzo
@ Grezzo请提供更多信息,好吗?我已更新回答,并且似乎确实交换了颜色并且没有使轨道变粗。你的代码是什么?在设置状态的正确图像后,您看到了什么? - siejkowski
1
我使用了你的代码,但是将 slider 更改为我的 slider IBOutlet(称为 rightSlider)。我记录了 minimum/maximumColor/Image,结果都是 nil。我将“something has changed”注释更改为记录的字符串,最终被记录下来了。 - Grezzo
我使用了你的代码制作了一个简单的项目(但对我来说不起作用),并将其上传到了GitHub上:https://github.com/Grezzo/SliderSwap - Grezzo
1
@Grezzo 非常感谢!似乎由于某种原因,在slider显示在屏幕上之前,它没有设置图像。将代码移动到viewDidAppear中可以让所有值正确报告。我真的不知道为什么会这样 - 这可能是UISlider类的实现细节。 - siejkowski
我明白了。很遗憾在视图出现之前无法完成此操作,但我想这是有道理的,因为那时图片还没有加载。感谢您的帮助! - Grezzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接