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