检测 UIPickerView 何时开始更改/移动

Posted

技术标签:

【中文标题】检测 UIPickerView 何时开始更改/移动【英文标题】:Detect when UIPickerView starts changing / moving 【发布时间】:2018-11-18 15:50:03 【问题描述】:

我正在尝试对 UIPickerView 开始移动的事件做出反应(而不是在已选择行时)。

我搜索了整个委托方法,但没有任何帮助。我还尝试注册一个通知,但是当用户将手指放在组件上并开始滚动时,我找不到任何通知。

有什么替代方案的想法吗?

【问题讨论】:

你想做什么? @RakeshaShastri 我有三个容器,每个容器都有一个pickerview。当我开始与选择器交互时,我想在容器上画一个边框 【参考方案1】:

您可以创建UIPickerView 的自定义类并覆盖hitTest(point:with:)。创建一个协议,您可以通过委托方法将当前选择器发送到您的控制器并绘制您喜欢的任何内容:

protocol CustomPickerViewDelegate: class 
    func didTapped(_ picker: CustomPickerView)


class CustomPickerView: UIPickerView 

    weak var myDelegate: CustomPickerViewDelegate?

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? 
        // Only test for points in your needed view
        if !self.point(inside: point, with: event) 
            return nil
        

        // Return using CustomPickerViewDelegate the current picker
        // that can be used to determine which one was selected
        myDelegate?.didTapped(self)

        // Call super.hitTest(_: with:)
        return super.hitTest(point, with: event)
    

不要忘记(在你的控制器中:例如YourViewController):

self.pickerView.myDelegate = self.

创建订阅CustomPickerViewDelegate协议的控制器的扩展:

extension YourViewController: CustomPickerViewDelegate 
    func didTapped(_ picker: CustomPickerView) 
        // do what you want here
        self.addBorderTo(picker: picker)
    

如果您愿意,可以扩展 UIPickerViewDelegate(请参阅下文如何扩展基类委托)

Extending a delegate from a base class

祝你好运:]

【讨论】:

好主意!委托声明应该是一个弱可选,而不是设置第二个委托,您应该只设置一个函数可选变量。 更新了弱代表的答案。它可以通过委托、块等来完成 :)

以上是关于检测 UIPickerView 何时开始更改/移动的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 amp 页面的 url 何时随 WKWebview 更改

Twitter Bootstrap - 如何检测媒体查询何时开始

检测 iframe 何时开始加载新 URL

Swift UIPickerView 第一个组件更改第二个组件数据

您如何在移动 safari 上检测 3G 与 Wifi 连接?

检测窗口何时停止移动?