iOS」カテゴリーアーカイブ

CLLocationのdistanceFromLocation:の精度が低い。

低い。4桁程度だろうか。
7000mくらい離れた2地点の距離を求めると、国土地理院が公開してる測地線長の計算式で求めたものとの差が1mくらいになる。

これはまあ、ほとんどの場合は4桁もあれば十分ではある。

ただ、3地点を結んでできる三角形の面積をヘロンの公式で求めるのにこの distanceFromLocation: を使ってて困ったことが起きた。面積がNaNになることがあるのである。

調べてみると、3地点がほぼ直線上にある場合にdistanceFromLocation:で得られる長さで計算すると

  長辺の長さが他の2辺の長さの和よりも長くなってしまう

場合が生じることが判った。。。 これはマズい。三角形にならないじゃん?
先の有効桁数以下の差ではあるのでこれが起きた場合は面積ゼロとして処理する。。とかやればいいのだが、うーむ。。。

測地線長を計算するよりは distanceFromLocation:の方が精度悪いとはいえ計算速いしなー、と悩んでたのだが、あれ? もしかして CLLocationがalloc/deallocされる時間を考慮したらあんま変わらないんじゃね? と思って計測したら案の定測地線長計算する時間より CLLocaitonの alloc/distanceFromLocation:/dealloc にかかる時間の方が1.2倍くらいかかってるではないか。

つまりこういうことだ。サヨウナラ distanceFromLocation: !!!

ちなみに測地線長の計算式で求めた2点間の長さで面積を計算した場合では面積がNaNになることはなかった。ぐらっちぇ

【iOS8】iPhoneでViewControllerをPopover表示

(これは2014年末にiOS8.0〜8.1に向けて書いたテキストです。また内容の正確性は保証しません)

これまでのUIPopverControllerはiPad専用でiPhoneでは使用できず、iPhoneでPopover的なことをやるには自前でそれらしいものを作る以外になかった。またUIPopoverControllerはiPhoneでは使えないので、ユニバーサルアプリでこれを使おうと思うと分けて処理する必要があり面倒だった。

iOS8からは、ViewControllerのmodalPresentationStyleに .Popover が追加され、これを指定して presentViewController するとポップオーバーとして表示されるようになった。
これを使うと、iPadではポップオーバーで、iPhoneだとモーダルな全画面で表示され、iPhoneとiPadで処理を分ける必要が無くなった。

めでたしめでたし。

じゃない。iPhoneでポップオーバーで表示したい。

できる。でもちょっとトリッキー。

まず最初に、UIPopoverControllerを使わずに、presentViewController:でポップオーバーを表示させるのはこんなカンジ。

ポイント:

  • .modalPresentationStyleを .Popoverにする
  • .preferredContentSizeを指定する。指定しないと予期しない大きさのポップオーバーが出てきてビックリする。
  • .popoverPresentationController でポップオーバーの出現する場所と矢印の向きなどの設定を行う

これで、iPadだとポップオーバーで、iPhoneだとモーダルで表示されるようになる。これまでモーダルな表示に使っていた presentViewControllerメソッドを使うし、iPhoneとiPadで処理を分ける必要がないし、だいぶいいカンジ。

んで、iPhoneでもポップオーバーさせるために、さらにちょちっと追加する。

ポイント:

  • presentationControllerのdelegateをセットする
  • デリゲートの adaptivePresentationStyleForPresentationController: メソッドを追加して、 .None を返す

これで iPhoneでもポップオーバー表示されるようになります。
スクリーンショット 2014-12-13 10.01.47

このiPhoneでもPopover表示を可能にする方法はWWDC2014のビデオ
View Controller Advancement in iOS 8
で紹介されているのだが、リファレンスなど探してもどこにもテキストでの記述が見当たらない。

iOS8の新機能ってWWDCビデオで紹介されてるけどアンドキュメントとか、ちょっと細かく弄ろうと思うとアンドキュメントでサンプルコード漁るしかないとかそんなん多いよ。。。