【Swift/UIKit】Pull to Refresh(プルリフ)の実装方法!UIRefreshControlの使い方

この記事からわかること

  • Swift/UIKitPull to Refresh(プルリフ)を実装する方法
  • UIRefreshControl使い方
  • UIScrollViewUITableViewスワイプ更新するには?
  • インジケータ文字を追加する
  • 引っ張る距離変更する

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

Pull to Refresh(プルリフ)とは?

Pull to Refresh(プルリフレッシュ)とは画面上のコンテンツを上から下に引っ張ってコンテンツを更新する操作のことです。主にUIScrollViewUITableViewなどのUIコンポーネントで使用されます。

【Swift/UIKit】Pull to Refresh(プルリフ)の実装方法!UIRefreshControlの使い方

UIRefreshControl

公式リファレンス:UIRefreshControl

UIRefreshControlスクロール可能なビューのコンテンツ更新をコントロールするためのクラスです。つまりプルリフレッシュを実装するためのクラスがSwiftでは提供されています。

プルリフレッシュを実装する手順

Swiftでプルリフレッシュを実装するためにはUIRefreshControlインスタンスを生成しUIScrollView/UITableViewrefreshControlプロパティにセットするだけです。

  1. UIRefreshControlインスタンスを実装
  2. UIScrollView/UITableViewのrefreshControlプロパティにセット
  3. 完了
class ViewController: UIViewController {
    
    @IBOutlet var scrollView: UIScrollView!
    private var refreshControl = UIRefreshControl()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        refreshControl.addTarget(self, action: #selector(handleRefreshControl), for: .valueChanged)
        scrollView.refreshControl = refreshControl
    }
    
    @objc func handleRefreshControl() {
        // 任意のデータ更新処理
        DispatchQueue.main.async {
            // プルリフレッシュ終了
            self.scrollView.refreshControl?.endRefreshing()
        }
    }
}

リフレッシュ後に実行させたい処理addTargetで追加します。データの更新が完了したらendRefreshingメソッドでプルリフレッシュを終了させます。

インジケータの色や文字を追加する

表示されるインジケータの色を変更したり、テキストを追加することも可能です。

refreshControl.addTarget(self, action: #selector(handleRefreshControl), for: .valueChanged)
refreshControl.tintColor = .orange
refreshControl.attributedTitle = NSAttributedString(string: "Loading...")
scrollView.refreshControl = refreshControl
【Swift/UIKit】Pull to Refresh(プルリフ)の実装方法!UIRefreshControlの使い方

引っ張る距離を調整する

参考文献:公式リファレンス:UIRefreshControl のプルダウンの距離を短くする

プルリフレッシュはUIScrollViewUITableView高さなどによって引っ張る距離が内部的に決められます。その際に高さが高すぎると画面いっぱいに引っ張らないと更新処理が動作しなくなってしまうのでその対処法として引っ張る距離を調整する方法があるようです。詳しくは上記の記事を参考にしてください。

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

Androidの実装はこちら

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index