Swift 的 KVO - 监听 WKWebView 高度变化(

2020-10-20  本文已影响0人  AndyGF

需求:

在实际开发中, 有很多情况需要通过数据的变化去更新 UI 高度的, 比如 tableView 的 header, webView 的高度.

方案:

class ViewController: UIViewController {
    // 需要被 observer 持有, 会随持有者被释放
    var observation: NSKeyValueObservation?
    
    private lazy var webView: WKWebView = {
        let config = WKWebViewConfiguration()
        config.allowsInlineMediaPlayback = true
        let wv = WKWebView(frame: , configuration: config)
        wv.scrollView.showsVerticalScrollIndicator = false
        wv.scrollView.showsHorizontalScrollIndicator = false
        return wv
    }()

   override func viewDidLoad() {
        super.viewDidLoad()

        webView.frame = view.bounds

        view.addSubview(webView)
        
        observerAndUpdateWebViewHeight()
    }

    // 监听网页滚动区域变化
    private func observerAndUpdateWebViewHeight() {
        
        observation = webView.scrollView.observe(\UIScrollView.contentSize, options: [.new]) { [weak self] (_, change) in
            
            guard let self = self else { return }
            // 直接获取新值
            let webH = change.newValue?.height ?? 0
            
            self.webView.frame.size.height = webH
        }
    }
}

相较原来OC的处理方式, Swift 优势:

注意:

class MyClass: NSObject {
    dynamic var phone: String = ""
    @objc var name: String = ""
}
上一篇 下一篇

猜你喜欢

热点阅读