如何让 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 Track
和Max Track
选择清晰的颜色
【讨论】:
以上是关于如何让 UISlider 的“轨道”不可见?的主要内容,如果未能解决你的问题,请参考以下文章