IOS Swift使用閉包實現(xiàn)View點擊,長按事件

類似Android上設(shè)置view的點擊,長按監(jiān)聽器

使用

       let label = UILabel()
       label.text = "測試"
        
        self.view.backgroundColor = UIColor.green
        self.view.addSubview(label)
        label.snp.makeConstraints { (make) in
            make.top.equalToSuperview().offset(0)
            make.width.equalTo(200)
            make.height.equalTo(80)
        }
        label.backgroundColor = UIColor.red
        
        label.addOnClick { (view) in
            ToastUtil.show("click")
        }
        
        label.addOnLongPress { (view) in
            ToastUtil.show("long press")
        }

實現(xiàn)原理

使用swift擴展,關(guān)聯(lián)屬性,閉包

import UIKit
import Foundation

extension UIView {
    //單擊事件
    typealias OnClickListener = (UIView) -> Void
    //長按事件
    typealias OnLongPressListener = (UIView) -> Void
    
    private struct AssociatedKeys {
        static var clickKey = "UIView.click"
        static var longPressKey = "UIView.onpress"
    }

    var clickListener: OnClickListener? {
        get {
            return objc_getAssociatedObject(self, &AssociatedKeys.clickKey) as? OnClickListener
        }
        set (listener) {
            objc_setAssociatedObject(self, &AssociatedKeys.clickKey, listener, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    
    var longPressListener: OnLongPressListener? {
        get {
            return objc_getAssociatedObject(self, &AssociatedKeys.longPressKey) as? OnLongPressListener
        }
        set (listener) {
            objc_setAssociatedObject(self, &AssociatedKeys.longPressKey, listener, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    
    func addOnClick(listener: OnClickListener?) -> Void {
        let tapGes = UITapGestureRecognizer(target: self, action: #selector(onClick))
        tapGes.numberOfTapsRequired = 1
        self.addGestureRecognizer(tapGes)
        self.isUserInteractionEnabled = true
        clickListener = listener
    }
    
    func addOnLongPress(listener: OnLongPressListener?) -> Void {
        let longPress = UILongPressGestureRecognizer(target: self, action: #selector(onLongPress))
        longPress.minimumPressDuration = 1
        self.addGestureRecognizer(longPress)
        self.isUserInteractionEnabled = true
        longPressListener = listener
    }
    
    @objc func onClick(sender: UITapGestureRecognizer) -> Void {
        if let listener = clickListener {
            listener(self)
        }
    }
    
    @objc func onLongPress(sender: UILongPressGestureRecognizer) -> Void {
        print(sender.state);
        if (sender.state == UIGestureRecognizer.State.began) {
            if let listener = longPressListener {
                listener(self)
            }
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容