如何让 UISlider 的“轨道”不可见?

Posted

技术标签:

【中文标题】如何让 UISlider 的“轨道”不可见?【英文标题】:How to make UISlider's "track" invisible? 【发布时间】:2011-05-08 05:53:33 【问题描述】:

我正在尝试在我的应用程序中模拟 Apple 的“滑动解锁”功能。我到了这一点(下图),但正如您所见,UISlider 的“轨道”是可见的,并且覆盖了我的文本。有没有办法以编程方式更改属性,使“轨道”不可见?

如果您需要我的任何代码,请告诉我。

提前致谢!

编辑:如果我将滑块的 alpha 更改为 0,它将摆脱我的滑动按钮,所以除非我做错了,否则这样做是行不通的。 :)

【问题讨论】:

复制幻灯片解锁 UI 违反了 Apple 的人机界面指南。 【参考方案1】:

可能没有办法隐藏曲目; “滑动解锁”的行为不像 UISlider 并且可能是自定义控件。您可能能够破解滑块控件,也许通过将不透明度设置为低(0 将使其隐藏并且不会接收触摸),但如果您走那条路线,您可能会在之后遇到一些问题操作系统更新。 Apple 不会像 Microsoft 那样为了兼容性而向后弯腰。

执行此操作的正确方法是使用自定义控件。这似乎比使用 UISlider 需要更多的工作,但如果您将它与您花费和/或将花费在破解 UISlider 上的所有时间进行比较,情况并非如此。

要做到这一点:子类 UIControl。编写您自己的绘图代码以使其看起来正确(您可能可以重用您现在正在做的一些事情)。然后注册触摸事件以移动滑块手柄:

UIControlEventTouchDown:如果它在手柄上,设置一个“移动”标志 UIControlEventTouchDragInside:如果设置了移动标志,则将手柄移动到触摸位置;您可以只更新一个实例变量,调用 setNeedsDisplay 将其绘制到新位置。 UIControlEventTouchUpInside:如果设置了移动标志,并且手柄在末端,则解锁

如果您想模仿真正的解锁手柄,请尝试一下,看看它的行为方式。您可能需要以不同的方式响应事件(如果您拖到滑块路径之外会发生什么情况)。但是你应该能够理解它的要点。

【讨论】:

很好的答案,我会尝试将不透明度更改为低设置,如果这不起作用,我将不得不尝试自己控制。感谢您的回答!【参考方案2】:

在回答所述问题时,您可以为最小和最大轨道图像设置一个透明的 1px png。

【讨论】:

这正是问题所在,正如您在我上面的回答中看到的那样。 你一定没有及时看到我的回答。请选择 benzado 的答案。这种方法对于您要完成的工作是正确的。【参考方案3】:

其实我只是想通了。这是我所做的:

UIImage *sliderMinimum = [[UIImage imageNamed:@"clearTrack.png"] stretchableImageWithLeftCapWidth:4 topCapHeight:0];
[slider setMinimumTrackImage:sliderMinimum forState:UIControlStateNormal];
UIImage *sliderMaximum = [[UIImage imageNamed:@"clearTrack.png"] stretchableImageWithLeftCapWidth:4 topCapHeight:0];
[slider setMaximumTrackImage:sliderMaximum forState:UIControlStateNormal];

clearTrack.png 只是我制作的一个清晰的滑块图像。

现在我有了这个:耶!

【讨论】:

谢谢顺便说一句,我从没想过这种方法。它比其他方法更简单、更快 这个问题的漂亮简单的解决方案。 您甚至不需要提供图像文件 - 查看其他答案。 在 iPad (ios 8) 上,仍然为最小轨道绘制了图像(可能是阴影)。【参考方案4】:

这里有一个更简单的方法。无需创建图像,只需实例化一个空的 UIImage 类:P

UIImage *clearImage = [[UIImage alloc] init];
[self.slider setMinimumTrackImage:clearImage forState:UIControlStateNormal];
[self.slider setMaximumTrackImage:clearImage forState:UIControlStateNormal];

【讨论】:

【参考方案5】:

在 Swift 中:

slider.setMinimumTrackImage(UIImage(), forState: .Normal)
slider.setMaximumTrackImage(UIImage(), forState: .Normal)

【讨论】:

很好的答案,但我建议您删除第一块代码之后的所有内容。这与问题非常相切,TL;DR 是使用一两个空图像就可以了。【参考方案6】:

看起来只是将色调颜色设置为清除就可以了...

    [slider setMinimumTrackTintColor:[UIColor clearColor]];
    [slider setMaximumTrackTintColor:[UIColor clearColor]];

【讨论】:

【参考方案7】:

@Arjay Waran 的回答在我看来是最好的。

这是它的 Swift 3.0 版本。

slider.minimumTrackTintColor = UIColor.clear
slider.maximumTrackTintColor = UIColor.clear

干杯

【讨论】:

【参考方案8】:

来自故事板:-

Min TrackMax Track 选择清晰的颜色

【讨论】:

以上是关于如何让 UISlider 的“轨道”不可见?的主要内容,如果未能解决你的问题,请参考以下文章

如何实现最小轨道从中心(值= 0)开始的滑块不离开

在 UIslider 轨道上获取事件

如何通过不可见的 UIslider 实现图像动画?

Swift UISlider多种轨道颜色[重复]

如何在不移动滑块拇指色调的情况下将多种颜色应用于uislider轨道?

如何增加 UISlider 的最大轨道的大小?