Ios 快速旋转旋钮

Ios 快速旋转旋钮,ios,swift,user-interface,swiftui,slider,Ios,Swift,User Interface,Swiftui,Slider,所以我尝试用一个旋钮来复制正常的SwiftUI滑块功能。我已经将UI编码好,并且当前连接到一个标准的SwiftUI滑块来旋转它 现在我需要添加其余的滑块功能(即$value、range、stride)和触摸功能(即上下、左右拖动时旋钮旋转)。老实说,我不知道该怎么做。非常感谢您的帮助 下面是主文件,可以在上的此处找到该项目 // //斯威夫特先生 // //布伦特·布林克利于21年3月7日创作。 // 导入快捷键 结构:视图{ //设置外圈和内圈的颜色 让颜色:颜色 //最小外观值: 设circ

所以我尝试用一个旋钮来复制正常的SwiftUI滑块功能。我已经将UI编码好,并且当前连接到一个标准的SwiftUI滑块来旋转它

现在我需要添加其余的滑块功能(即$value、range、stride)和触摸功能(即上下、左右拖动时旋钮旋转)。老实说,我不知道该怎么做。非常感谢您的帮助

下面是主文件,可以在上的此处找到该项目

//
//斯威夫特先生
//
//布伦特·布林克利于21年3月7日创作。
//
导入快捷键
结构:视图{
//设置外圈和内圈的颜色
让颜色:颜色
//最小外观值:
设circleMin:CGFloat=0.0
//最大外观值
设circleMax:CGFloat=0.9
//因为我们的圆缺了一大块我们必须考虑的度数
//为了这次调整
设CirconOffsetAmnt:CGFloat=1/0.09
//正确对齐旋钮所需的偏移量
让旋钮偏移:角度=.degrees(110)
//计算圆的中点的距离
var中点:CGFloat{
0.4*circOffsetAmnt
}
//用户可修改控制值
@状态变量值:CGFloat=0.0
var body:一些观点{
VStack{
ZStack{
//标记:-带虚线的旋钮
旋钮(颜色:彩色)
.旋转效应(
//当前由滑块控制
.度(最大(0,双精度(360*值)))
)
.手势(牵引力(最小距离:0)
.onChanged({中的值
//需要基于x和y触摸拖动设置数量的帮助吗
}))
//马克:-灰环
圈()
.修剪(从:circleMin到:circleMax)
.stroke(颜色.灰色,样式:StrokeStyle(线宽:6,线帽:。圆形,破折号:[0.5,8],破折号相位:20))
.框架(宽度:100,高度:100)
//标记:-表示更改的彩色环
圈()
.trim(从:circleMin,到:value)
.stroke(颜色、样式:StrokeStyle(线宽:6,线帽:。圆形,短划线:[0.5,8],短划线相位:20))
.框架(宽度:100,高度:100)
}
.旋转效应(旋钮偏移)
文本(\(值*circOffsetAmnt,说明符:%.0f”))
滑块(值:$value,in:circleMin…circleMax)
.框架(宽度:300)
.accentColor(.橙色)
}
}
}
结构DashedCircle\u预览:PreviewProvider{
静态var预览:一些视图{
FK旋钮(颜色:橙色)
}
}

这是我在一个项目中使用的一个版本

开始拖动时,它会设置一个初始值(存储在
startDragValue
中)。这是因为您总是希望值的修改基于启动时旋钮的值

然后,我决定只基于y轴更改值。合理的做法是:可以根据从x1,y1到x2,y2的绝对距离进行更改,但在尝试获取负值时会遇到问题。例如,右上象限可能是一个整体的增加,但左上象限呢?它会导致正变化(因为y轴变化)还是负变化(因为x轴变化)

如果你决定走x,y改变的路线,这个方法仍然会让你建立起来

struct ContentView: View {
    @State var value : Double = 0.0
    @State private var startDragValue : Double = -1.0
    var body: some View {
        Text("Knob \(value)")
            .gesture(DragGesture(minimumDistance: 0)
            .onEnded({ _ in
                startDragValue = -1.0
            })
            .onChanged { dragValue in
                let diff =  dragValue.startLocation.y - dragValue.location.y
                if startDragValue == -1 {
                    startDragValue = value
                }
                let newValue = startDragValue + Double(diff)
                value = newValue < 0 ? 0 : newValue > 100 ? 100 : newValue
            })
    }
}
struct ContentView:View{
@状态变量值:双精度=0.0
@国家私有var startDragValue:Double=-1.0
var body:一些观点{
文本(“旋钮\(值)”)
.手势(牵引力(最小距离:0)
.onEnded({uu}in
startDragValue=-1.0
})
.onChanged{dragValue in
设diff=dragValue.startLocation.y-dragValue.location.y
如果startDragValue==-1{
startDragValue=值
}
设newValue=startDragValue+Double(差异)
value=newValue<0?0:newValue>100?100:newValue
})
}
}
我的滑块基于控件上下100磅的值,但您显然也可以根据自己的喜好更改这些值


就范围而言,我建议始终将旋钮从0.0调整到1.0,然后再对值进行插值。

谢谢,这对推进这一过程肯定很有帮助。我现在正在玩弄它。在@jnpdx为你提问。我已经让它工作了,但当你再次点击一个旋钮时,它会自动重置到初始的起始位置。我们怎样才能避免这种情况?@BrentBrinkley我只是复制并粘贴了我编写的代码,而这对我来说并没有发生。你确定是我的代码在做这件事,而不是你所做的修改或你所处的情况的函数吗?发现问题@jnpdx这是我所做的编辑。