我正在开发一个应用程序,使用UISlider并需要将其设为循环。 是否可以通过一些本机代码,或者是否必须集成第三方库?
我想填充颜色,因为用户将滑过滑块。
答案 0 :(得分:1)
您可以找到圆形滑块的第三方库。
看看这些:
https://www.cocoacontrols.com/controls/uicircularslider
答案 1 :(得分:1)
我在具有多个链接的单独线程中遇到了这个问题,并且不喜欢提供的任何答案,因此我想我会在似乎最相关的线程中添加自己的答案,以免其他人找到他们在这里的方式,喜欢我提供的选项。
这不是优雅或简单,但很容易,我认为这将是其他人发展自己的良好起点。
在此示例中,圆形uiScroller放置在显示在SKView顶部上方的视图(或HUD)上。然后,我使用hitTest将任何触摸从gameScene传输到UIView,并使用_touchesBegan和_touchesMoved更新一系列隐藏的按钮,如下所示:
the arrows are all hidden but we use the frames of each box to register where the touch is
我制作了箭头UIButtons,所以使用情节提要更加容易,但是我认为imageView可以正常工作,因为我们只检查_touchesBegan内的箭头框架,然后将其发送到函数,而不是从中收集触摸事件。箭头本身。
if upBtn.frame.contains(touch) {
upBtnPress() //if you made this a touch func like me a call to (self) as the sender may be required
}
黑色圆圈本身仍然可见,因此看起来就是水龙头要去的地方。
然后您最终会创建多个图像,如下所示:
any circular pattern for each location possible is appropriate
(我总共得到16分)
然后在任何按下功能下,您只需更改黑圈的图像即可根据触摸位置的位置和完成情况来显示正确的图像!
circleDpad.image = UIImage(named: "up")
计算角度:
非常简单,我的表盘上有16个点,因此我需要将其转换为1 ... 360的可能方向。
func angleChanged(angle: CGFloat) {
let valueReached = (angle / 16) * 360 // this gives you the angle in degrees, converting any point that's x/16 into x/360
let turret = checkBaseSelect() //this is my personal code
turret?.tAngle = CGFloat(valueReached) * (CGFloat.pi / 180) //this converts degrees to radians and applies it where I want it.
}
尽管只有16个点,但我发现即使不应用动画,它看起来也相当平滑。感谢您的阅读。
this is a gif of my circular slider in action
这是我有史以来的第一个指南,如果它需要更多信息(或者应该在其他地方),请告诉我。