引越しや新生活等でバタバタしていて、なんだかんだで前回の記事から1ヶ月以上が経ってしまいました。前回の記事で書くよ!っていってた記事も全く書けていないのですが、忘れないうちに最近出会ったバグシリーズを書いていこうと思います。今回はUICollectionViewのUIRefreshControlを用いた時にtintColorの色が変わらない現象が発生したことについて書いていきます。確認済みですが、おそらく大分前からある現象です。等のUIRefreshControlが追加できるもので確認できます。(一応私はUICollectionViewでのみ確認してあります。)viewDidAppear(_:)内で呼び出した際には以下のようになります。この動画のコードはこんな感じ。}}10行目で色を設定しているにも関わらず、viewDidAppear(_:)内でbeginRefresing()を呼ぶと黒色のインジケーターが表示されます。その後手動でリフレッシュする際には設定した色が表示されます。viewDidLoad(:)やviewWillAppear(:)で呼んだ場合にも同様に発生します。した結果、viewDidAppear(_:)が呼び出されるタイミングでUIRefreshControlのセットアップが終わってないのかなぁと思われます。}0.25秒かけてcollectionViewを下にひっぱるアニメーションアニメーション完了後、beginRefresh()でリフレッシュを始めるRefreshControlの値が変わった通知を送る(これを呼び出すことでhandleRefreshControl(_:)が呼ばれる)手順はこの3つです。実際の動きは以下の通りです。成功例をみたところで、失敗例と比較していこうと思います。先にbeginRefreshを呼んでしまう一見良さそうに見えるんですが、失敗します。黒くなってしまいます。animateブロックでbeginRefresingしちゃうこれはなかなか愉快な挙動します。一瞬黒く表示され、その後白に変わっていきます。あとなんかいつもよりくるくるします。実は成功例は、この一瞬黒く表示される間にインジケーター自体が表示されていません。この失敗例でも実際に引っ張ってリロードする時と同じように徐々に表示されているわけではなく、アニメーションなしで表示されます。(本当は1つずつ円を描くアニメーションをして欲しいよね...)Extensionを作成したよUIScrollView系統のサブクラスで起こる問題なので、UIScrollViewのExtensionを書きました。}}こちらはcollectionViewでも問題なく使えます。beginRefreshing()を呼んだ後にすぐendRefreshing()を呼び出すと動きがかくつくので、少し待ってからsendActions(for:)を呼ぶようにしています。デモを作成したので実際に動かして試してみてください。uruly/RefreshControlTintColorDemo終わりにブログ書くのが月1とかになってるのでもっと書きたいんですが、iOSのお仕事中に書いてることをブログに書いてしまっていいのかというのにかなり判断に悩んでしまいます。あと単純にブログを書くのに時間と体力を使うのでなかなか書き始められない...ここまで書いておいて今更なんですが、投稿して良いかお聞きしたところOK頂けたので、とりあえず安心して公開しようと思います。今週は少し余裕があるはずなので、ちょこちょこと書いていこうと思います。ほいではでは〜Commentsコメントはありません。現在コメントフォームは工事中です。Newer新作iOSアプリ「OKAIMO」を仮リリースしました。Older【iOSアプリ】AppAppのソースコードを公開しました。Overview【UIRefreshControl】beginRefreshingを呼び出した時にtintColorが変わらなかった話。