UIRefreshControl のプルダウンの距離を短くする

検証環境:
Xcode 11.3
Swift 5.1.3

標準 の UIRefreshControl ですがアクションを開始させるためのプルダウンの距離が長いので短くする方法について調べました。
いくつかやり方はあるようですが今回は非推奨なやり方になりますが UIRefreshControl のプライベートプロパティ_snappingHeightを書き換える方法で実装しました。
_snappingHeightにはキー値コーディングでアクセスしますが、将来的にアクセスできなくなってもクラッシュしないように setValue: forUndefinedKeyvalueForUndefinedKeyをオーバーライドしておきます。

import UIKit

class MyRefreshControl: UIRefreshControl {
    
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
        print("Ouch. undefined key: \(key)")
    }
    
    override func value(forUndefinedKey key: String) -> Any? {
        print("Ouch. undefined key: \(key)")
        return nil
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        changeSnappingHeight()
    }
    
    private func changeSnappingHeight() {
        self.setValue(60, forKey: "_snappingHeight")
    }
}

そして ScrollView に追加する。

let refreshControl = MyRefreshControl()
tableView.addSubview(refreshControl)
refreshControl.addTarget(self, action: #selector(loadMoreMessages), for: .valueChanged)

参考:
https://stackoverflow.com/questions/28886365/ https://stackoverflow.com/questions/25699331/