iOS で引っ張って更新するやつ

たまには iOS のプログラムの話などを

iOS6 から標準搭載された「引っ張って更新」の実装についてです。
あの Passbook とかで使ってるやつですね。

これ UIRefreshControl ってやつで、実装自体は至極簡単にできます。
がしかしです、これ UIWebView で使おうとするとちょっと填まります。たぶん UIScrollView で使っても同じく填まると思います。

まぁ、UIWebView で UIRefreshControl を使うこと自体もググれば簡単に見つかるのですが、填まり所は UIWebView でピンチ操作して横にもスクロールするようになった場合です。

もともとこれの実装が UITabelView とかを前提にしているのか、横に(右に)スクロースした状態で「引っ張って更新」すると見事に UIRefreshControl がセンターからズレてしまいます。

それで、UIScrollViewの横スクロール量で補正して UIRefreshControl をずらしてやれば良いところまではなんとなく分かったのですが、これが全然移動してくれねぇ…

てーことで、あえなく挫折です。
_| ̄|○

で、このままアプリへの実装をあきらめるのもなんなので ODRefreshControl を改造することにしました。
これも同じように「引っ張って更新」をしてくれるオープンソースのコードなのですが、まぁこちらもそのままだと見事にズレます(笑)

修正箇所は4カ所

observeValueForKeyPath メソッドに「_activity.center = …」ってのがあるのですが、これはクルクル回るコントロールを表示する位置です。
これれのX座標に横スクロールのオフセット値
[self.scrollView contentOffset].x を加算してやります。

あと、同じメソッド内に「CGPoint bottomOrigin = …」ってのがあるのですが、これ以降に3カ所ほど「self.bounds.size.width / 2」ってのがあるので、これにも同じオフセット値を加算してやります。
こちらはビヨーンと伸びるやつの表示位置ですね。

一応これで解決です。(たぶん)


UIRefreshControl での解決方法分かる人いましたら教えて下さい。
ODRefreshControl は、iOS5 でも使えるので、現時点ではこっちの方がメリットある気はしますけどね。