【发布时间】:2019-08-26 16:41:55
【问题描述】:
我正在 SwiftUI 中创建一个自定义步进控件,并尝试复制内置控件的加速值更改行为。在 SwiftUI Stepper 中,长按“+”或“-”将不断增加/减少值,按住按钮的时间越长,变化速度越快。
我可以通过以下方式创建按住按钮的视觉效果:
struct PressBox: View {
@GestureState var pressed = false
@State var value = 0
var body: some View {
ZStack {
Rectangle()
.fill(pressed ? Color.blue : Color.green)
.frame(width: 70, height: 50)
.gesture(LongPressGesture(minimumDuration: .infinity)
.updating($pressed) { value, state, transaction in
state = value
}
.onChanged { _ in
self.value += 1
}
)
Text("\(value)")
.foregroundColor(.white)
}
}
}
这只会增加一次值。将计时器发布者添加到 onChanged 修饰符,以实现如下手势:
let timer = Timer.publish(every: 0.5, on: .main, in: .common)
@State var cancellable: AnyCancellable? = nil
...
.onChanged { _ in
self.cancellable = self.timer.connect() as? AnyCancellable
}
将复制更改的值,但由于手势永远不会成功完成(永远不会调用onEnded),因此无法停止计时器。手势没有onCancelled 修饰符。
我也尝试使用TapGesture 来执行此操作,这将用于检测手势的结束,但我看不到检测手势开始的方法。这段代码:
.gesture(TapGesture()
.updating($pressed) { value, state, transaction in
state = value
}
)
在$pressed 上生成错误:
无法将“GestureState”类型的值转换为预期的参数类型“GestureState<_>”
有没有办法复制行为而不回退到 UIKit?
【问题讨论】: