インターフェースというのはプログラム上のものを指します。

iphone_dev_jpの勉強会で、独自のUIRefreshControlを実装するにはどうすればよいか、
という質問をいただきましたので、しばらく考えていました。

UIRefreshControlのメソッド群はよく隠蔽化されていて、カスタマイズすることは難しいです。
なので、独自のものをつくるにはUIControlからスタートすることになると思います。
どんなインターフェースがあればUIRefershControlはカスタマイズ可能だったのかと考えつつ、
独自のUIRefreshControlを実装するための抽象的なクラスを実装しました。

ISAlternativeRefreshControl

抽象クラスが持つ値

  • progress: UIControlEventValueChangedを発火させるまでの引っ張り具合(0.0〜1.0)
  • refreshingState: 更新前/更新中/更新後の状態
  • firesOnRelease: 閾値を超えたらすぐ発火するか、閾値を超えた状態で指を離してから発火するか

progressの変更を通知するメソッド

  • willChangeProgress:
  • didChangeProgress

これらのタイミングで、progressに応じてUIRefreshControlを変形させます。
公式のUIRefreshControlであればprogressに応じて伸び具合を変え、
従来型の矢印の”引っぱって更新”であればprogressに応じて角度を変えます。

refreshingStateの変更を通知するメソッド

  • willChangeProgress:
  • didChangeProgress

これらのタイミングで、状態に応じたアニメーションを開始したりします。
公式のUIRefreshControlであればガムを収縮させてUIActivityIndicatorを拡大させ、
従来型の矢印の”引っぱって更新”であれば矢印を消してUIActivityIndicatorを表示します。

このようなインターフェースがあれば、上記のメソッドをオーバーライドすることで、
独自の動きを表現する実装が可能となるはずです。
実際、従来型の”引っぱって更新”や公式のUIRefreshControlはこれらの枠組みで再現できました。

興味が有る方はリポジトリにデモアプリが入っているので見てみてください。