如何获得 UISlider 的默认 maximumTrackTintColor

Posted

技术标签:

【中文标题】如何获得 UISlider 的默认 maximumTrackTintColor【英文标题】:How can I get the default maximumTrackTintColor for a UISlider 【发布时间】:2014-12-25 21:44:40 【问题描述】:

我正在尝试使 UISlider 在右侧具有淡色,在左侧具有暗色(交换它们)

我能够在右侧获得正确的颜色

mySlider.maximumTrackTintColor = self.view.tintColor

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

我试过了

mySlider.minimumTrackTintColor = mySlider.maximumTrackTintColor

在我设置 maximumTrackTintColor 之前,但这不起作用,因为如果尚未设置自定义颜色,mySlider.maximumTrackTintColor 将返回 nil。

【问题讨论】:

我知道我可以做到UIColor.lightGrayColor(),但默认颜色可能会在未来版本的 ios 中改变,所以我想以编程方式找出 UISlider 中使用的内容。 你想改变颜色的饱和度吗? @LeonardoSavioDabus 默认情况下,拇指左侧的轨道为蓝色,右侧为灰色。我想拇指的左边是灰色的,右边是灰色的。但我不想将其设置为灰色;我想知道 UISlider 使用什么颜色并交换它们。 我知道这很愚蠢,但也许您可以将控件旋转 180 度并将委托回调中的值标准化? @siejkowski 我想过,但如果他们在未来设置任何投影或类似效果,它会看起来很奇怪。 【参考方案1】:

好的,所以问题是您正在尝试获取 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

结果是(前上图,后下图):

【讨论】:

很好地发现它使用的是图像,而不是色调。但是您的代码似乎只是使轨道变厚,它不会交换颜色 @Grezzo 您能否提供更多信息?我已经用我得到的结果更新了答案,似乎它确实交换了颜色并且不会使轨道变厚。你的代码是什么?为状态设置正确的图像后,您看到了什么? 我使用了您的代码,但将 slider 更改为我的滑块 IBOutlet(称为 rightSlider)。我记录了最小/最大颜色/图像,都是nil。我将“某事已更改”注释更改为记录的字符串,并最终被记录。 我用你的代码做了一个简单的项目(这对我不起作用)并将它贴在 GitHub 上:github.com/Grezzo/SliderSwap @Grezzo 非常感谢!似乎无论出于何种原因slider 在屏幕上显示之前都没有设置图像。将代码移动到viewDidAppear 可以正确报告所有值。我真的不知道为什么会这样 - 它可能是 UISlider 类的实现细节。

以上是关于如何获得 UISlider 的默认 maximumTrackTintColor的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UISlider 拇指图标:如何阻止拇指图标在拖动时恢复为默认圆形图标?

UISlider 拇指中心位于轨道的起点和终点

如何在单个@IBAction 中获取多个 UISlider 的值?

如何保持 UISlider 拇指小但分辨率更高的照片?

给 UISlider 进度条圆角 [Swift]

如何在 iOS 中延迟 UISlider 的开始触摸事件?