UISlider 与 ProgressView 结合
有没有一种苹果公司制造的方法来获取带有 ProgressView 的 UISlider。许多流媒体应用程序都使用它,例如本机 Quicktimeplayer 或 YouTube。 (只是为了确定:我只对可视化感兴趣)
欢呼西蒙
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
这是您所描述内容的简单版本。
从某种意义上说,它是“简单”的,因为我没有费心尝试添加阴影和其他微妙之处。但它很容易构建,如果您愿意,您可以调整它以更微妙的方式绘制。例如,您可以制作自己的图像并将其用作滑块的拇指。
这实际上是一个 UISlider 子类,位于绘制温度计的 UIView 子类 (MyTherm) 之上,加上两个绘制数字的 UILabel。
UISlider 子类消除了内置轨道,因此其后面的温度计可以显示出来。但UISlider的拇指(旋钮)仍然可以按正常方式拖动,并且可以将其设置为自定义图像,在用户拖动时获取Value Changed事件等等。下面是消除其自身轨道的 UISlider 子类的代码:
温度计是自定义 UIView 子类 MyTherm 的实例。我在笔尖中实例化了它,并取消选中它的“不透明”,并为其指定了“透明颜色”的背景色。它有一个
value
属性,因此它知道要填充温度计多少。下面是其drawRect:
代码:要更改温度计值,请将 MyTherm 实例的
value
更改为 0 到 1 之间的数字,并告诉它使用setNeedsDisplay 重新绘制自身
。Here's a simple version of what you're describing.
It is "simple" in the sense that I didn't bother trying to add the shading and other subtleties. But it's easy to construct and you can tweak it to draw in a more subtle way if you like. For example, you could make your own image and use it as the slider's thumb.
This is actually a UISlider subclass lying on top of a UIView subclass (MyTherm) that draws the thermometer, plus two UILabels that draw the numbers.
The UISlider subclass eliminates the built-in track, so that the thermometer behind it shows through. But the UISlider's thumb (knob) is still draggable in the normal way, and you can set it to a custom image, get the Value Changed event when the user drags it, and so on. Here is the code for the UISlider subclass that eliminates its own track:
The thermometer is an instance of a custom UIView subclass, MyTherm. I instantiated it in the nib and unchecked its Opaque and gave it a background color of Clear Color. It has a
value
property so it knows how much to fill the thermometer. Here's itsdrawRect:
code:To change the thermometer value, change the MyTherm instance's
value
to a number between 0 and 1, and tell it to redraw itself withsetNeedsDisplay
.使用标准控件可以做到这一点。
在 Interface Builder 中,将
UISlider
立即放置在UIProgressView
之上,并使它们的大小相同。在
UISlider
上,背景水平线称为轨道,技巧是使其不可见。我们使用透明 PNG 和UISlider
方法setMinimumTrackImage:forState:
和setMaximumTrackImage:forState:
来完成此操作。在视图控制器的
viewDidLoad
方法中添加:其中
self.slider
指的是您的UISlider
。我已经在 Xcode 中测试了代码,这将为您提供一个带有独立进度条的滑块。
This is doable using the standard controls.
In Interface Builder place your
UISlider
immediately on top of yourUIProgressView
and make them the same size.On a
UISlider
the background horizontal line is called the track, the trick is to make it invisible. We do this with a transparent PNG and theUISlider
methodssetMinimumTrackImage:forState:
andsetMaximumTrackImage:forState:
.In the
viewDidLoad
method of your view controller add:where
self.slider
refers to yourUISlider
.I've tested the code in Xcode, and this will give you a slider with an independent progress bar.
适合我的设计的解决方案:
Solution that suits my design:
创建 UISlider:
享受吧! PS我可能有一些错别字。
Create a UISlider:
Enjoy! P.S. I might have some typos.
想法1:
您可以通过子类化 UISlider 轻松地将其用作进度视图。它响应诸如“setValue:animated:”之类的方法,您可以使用这些方法设置视图的值(即:进度)。
创建您在示例中看到的内容的唯一“限制”是缓冲栏,您可以通过“创造性地”对 UISlider 进行换肤来创建缓冲栏(因为您可以向其中添加自定义皮肤),并且可能以编程方式设置该皮肤。
想法2:
另一个(更简单的)选项是子类化 UIProgressView,并在该子类中创建一个 UISlider。您可以对 UISlider 进行皮肤设置,使其具有透明皮肤(没有栏,只有旋钮可见)并将其放置在 UIProgressView 上。
您可以使用 UIProgressView 进行预加载(缓冲),使用 UISlider 进行电影控制/进度指示。
看起来相当容易:-)
编辑:要真正回答您的问题,没有内部方法,但使用给定的工具很容易完成。
Idea 1:
You could easily use the UISlider as a progress view by subclassing it. It responds to methods such as 'setValue:animated:' with which you can set the value (i.e: progress) of the view.
Your only 'restriction' creating what you see in your example is the buffer bar, which you could create by 'creatively' skinning the UISlider (because you can add custom skins to it), and perhaps set that skin programmatically.
Idea 2:
Another (easier) option is to subclass UIProgressView, and create a UISlider inside that subclass. You can skin the UISlider to have a see-through skin (no bar, just the knob visible) and lay it over the UIProgressView.
You can use the UIProgressView for the pre-loading (buffering) and the UISlider for movie control / progress indication.
Seems fairly easy :-)
Edit: to actually answer your question, there is no in-house way, but it would be easy to accomplish with the tools given.
你可以做一些这样的技巧,它更容易和理解。只需将以下代码插入您的 UISlider 子类中即可。
You can do some trick like this, it's more easy and understanding. Just insert the code bellow in your UISlider subclass.
添加 matt 的解决方案,请注意,从 iOS 7.0 开始,实现 trackRectForBounds: 是不可能的。这是我对此问题的解决方案:
在您的 UISlider 子类中,执行以下操作:
使用 imageWithColor 作为此函数:
这将正确处理这个烦人的 trackRectangle。
我花了太多时间寻找这个问题的解决方案,希望这能为另一个可怜的灵魂节省一些时间;)。
Adding on matt's solution, note that as of iOS 7.0, implementing trackRectForBounds: is rendered impossible. Here is my solution to this problem :
In your UISlider subclass, do this :
with imageWithColor as this function :
That will properly take care of this annoying trackRectangle.
I spent too much time looking for a solution to this problem, here's hoping that'll save some time to another poor soul ;).
这是 Objective C 中的一个解决方案。 https://github.com/abhimuralidharan/BufferSlider
这个想法是创建 UIProgressview 作为 UISlider 子类中的属性,并以编程方式添加所需的约束。
Here is a solution in Objective C. https://github.com/abhimuralidharan/BufferSlider
The idea is to create a UIProgressview as a property in the UISlider subclass and add the required constraints programatically.
对于 Swift5
首先,为滑块添加点击手势:
然后,实现此功能:
for Swift5
First, add tap gesture to slider:
Then, implement this function: