如何确定 DatePicker 当前是否正在旋转/滚动?我几乎尝试了所有方法并查看了此处的所有答案,但没有一个是正确的或有效的。
本质上,我想在它旋转时禁用一个按钮,然后在它停止时启用同一个按钮。
谢谢!
最佳答案
我想做同样的事情,所以围绕着 UIControl 和 UIDatePicker 的类转储。似乎没有任何效果,因为 maddy
在评论部分说明。
好吧,我确实想到这是一种方法 - 在短时间内截取选择器 View - 比如 50 毫秒 - 并在之前和之后进行图像比较,看看它是否发生变化。这看起来确实需要做很多工作!
所以我尝试了各种方法(iOS13),我发现我可以使用手势识别器来检测第一次触摸选择器的时间,以及 UIDatePicker 自己的识别器何时更新。这让我通常可以检测到用户交互何时可能结束。
然后,我可以等待旋转停止的 Action 方法。啊,但是如果用户只是移动了一个轮子,然后把它放回去,会发生什么?如果新日期与旧日期相同,则无操作方法。所以我所做的是使用延迟调度工作项,并在两秒钟后将微调器裁定为停止。
final class DHDatePicker: UIDatePicker, UIGestureRecognizerDelegate {
var isSpinning = false { didSet { print("IS SPINNING", isSpinning) } }
private var didAddGR = false
private var cancelBlock = DispatchWorkItem(block: {})
override init(frame: CGRect) {
super.init(frame: frame)
let gr = UISwipeGestureRecognizer()
gr.direction = [.up, .down]
gr.delegate = self
self.addGestureRecognizer(gr)
self.addTarget(self, action: #selector(dateChanged(_:)), for: .primaryActionTriggered)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc func gr(_ gr: UISwipeGestureRecognizer) {
switch gr.state {
case .ended, .cancelled, .failed:
cancelBlock.cancel()
cancelBlock = DispatchWorkItem(block: {
if self.isSpinning {
self.isSpinning = false
}
})
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0, execute: cancelBlock)
print("GR ENDED")
default:
print("WTF")
break
}
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
isSpinning = true
return true
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if didAddGR == false {
didAddGR = true
print("DP Attach to Other GR")
otherGestureRecognizer.addTarget(self, action: #selector(gr(_:)))
}
return false
}
@objc func dateChanged(_ sender: UIDatePicker) {
print("DP ActionMethod")
cancelBlock.cancel()
isSpinning = false
}
}
关于ios - 如何确定 DatePicker 是否正在旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46180546/