ios - 如何确定 DatePicker 是否正在旋转?

标签 ios swift datepicker

如何确定 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/

相关文章:

iphone - 如何将 Interface Builder 文档版本控制默认设置为 4.2?

ios - 根据检索到的数据类型创建自定义单元格

ios - UISearchController 未调用的行数

javascript - 如何显示jquery日期选择器?

javascript - Kendo UI 日期选择器按周捕获

iphone - 如何连接到需要用户名和密码的网站

iphone - 释放自定义单元格类应用程序中的对象时崩溃

ios - 滚动到 UITableView 底部时出现问题

swift - 为什么具有可选关联值的 Swift 枚举在声明时需要尾随括号?

javascript - ionic v1 类型 ="date"