2015年12月29日火曜日

NavigationBar が View に重なる対応について

今更ながらのところでもあるけど、UINavigationController を使用している場合に、storyboard 上で、NavigationBar が View に重なる対応についてどうすれば良いかを考えて見ることにする。

この内容は iOS7 から View がフル画面表示に変わった時から発生した内容なので、なぜ今頃という面があるかもしれないが、今一歩良い対応方法が見つからないので、調べてみることにした。

ちなみに、今までは、先にビューのデザインをして、オブジェクトを配置後に、座標0, 0 の位置にずらす方法で対応していた。
よって、最終的にはナビゲーションバーの下にオブジェクトが配置される様になる。
この方法で、実行時には問題なく表示されるのだが、問題点はメンテナンスを行う際に、ナビゲーションバーの下のオブジェクトを見逃す場合があると言うこと。
(そんなバカなと思うかもしれないが、焦って対応をする場合などは案外見落としがちになる)
その他、あえてナビゲーションバー分下にビューをずらす方法も考えたが、Autolayout の制約が難しくなるので却下した。

この問題に対応すべく storyboard を使用した場合の良い方法を調べてみることにした。
調べてみると、みんなどうやってこの部分を対応しているかよく分からない。
この内容でよく引用されているのが以下の記事。
やはりお前らのiOS7対応は間違っている(解説編)
http://qiita.com/yimajo/items/254c7cebab7864678246
上記や、その他のサイトを見る限り以下の方法がある。
  1. ViewController の Extend Edges の Under Top Bars と、Under Bottom Bars のチェックを外す
  2. 上としっしょだが、コードで指定する
    self.edgesForExtendedLayout = UIRectEdgeNone;
  3. NavigationController の Navigation Bar の Translucent のチェックを外す
いずれも、ビュー開始位置がナビゲーションバーの下からになる。
(すりガラス的な効果が消えたふうに見える)
その他、各 ViewController の Extend Edges の Under Top Bars のチェック、
同じく、ViewController の Adjust Scroll View Insets のチェックを外すなどもある。

うーん。
調べてみた結果自分の困っている内容(Xcode での視界性の悪さ)とは別の内容(アプリの仕様というか不具合対応)での回答が多いようだ。

ここいら辺を踏まえて、自分の問題に対するベターと思われる方法を考えてみた。
方法は、上記のいずれのチェックも外さずに、NavigationController の Attributes にある Shows Navigation Bar のチェックを外し、コード上でこの属性を有効にする方法。
これであれば、Storyboard からは、ナビゲーションバーの表示が消えて、作業・確認しやすくなる。
制約等も直感的に付けることが出来る。
この場合は、ナビゲーションバー先頭の ViewController の viewDidLoad で
[[self navigationController] setNavigationBarHidden:NO animated:YES];
// Swift
self.navigationController?.setNavigationBarHidden(false, animated: true)
とするか、サブクラスを作成して、上記のコードで指定するなどが必要。
難点は、画面上からナビゲーションバーが消えてしまうので、ナビゲーションバーが存在しないかと思ってしまう点か。
(storyborad に UINavigationController が出ているから大丈夫とは思うが)
あくまで、ベターなのでベストがわからない。。。

しかし、なぜこんなに苦労が必要なのだろうか?
storyboard で見えたとおりに表示されないという Xcode 側に問題がある気がするのだが(ナビゲーションバーとフル画面を表示したいなら storyboard でナビゲーションバー部分を別表現すればいいのに)、Xcode 作っている開発者は違和感覚えないのだろうか?
Written with StackEdit.

2015年12月28日月曜日

デジタルノート環境について

文具ネタ

年も押し迫ったということで、資料というかメモ紙の整理をしていた。
普段は、A4 のコピー用紙をメモ紙にしているが、物凄く大量に紙を消費してしまう。

これはアカン(経済的にも、環境的にも、情報整理的にも)と思って、iPad で使用できるデジタルペンとアプリに移行しようと目論んでいた。
その時に買った内容とその時のレビューが以下の内容

BAMBOO STYLUS fineline を買ってみた
http://tizio1976.blogspot.jp/2015/09/bamboo-stylus-fineline.html

結果をいうと、実務ではかなり厳しかった。
厳しかった内容は以下のとおり
  • 拡大領域で書くので感覚が慣れない(紙とペンは1対1)
  • 考え事や、タイピングをしているとその間にペアリングが切れてしまう
  • パームリジェクションが今ひとつ
慣れの部分もあるかもしれないが、慣れる前にストレスがたまりまくり効率が悪くなった。
結局、紙とペンのに戻ってしまった。

あれから、iPad Pro + ペンシルが良いとのレビューを見たが、割りかし高価なため、用途を考えるとちょっと手が出せない。

そんな中、アナログとデジタルのハイブリッド?というのか、コクヨの CamiApp S を記事を発見した。

CamiApp S(コクヨ)
http://www.kokuyo-st.co.jp/stationery/camiapp-s/index.html

どうやら手書きで入力したものがスマートフォンへ保存といった代物のようだ。
この手の物は、以前から発売されているが、今回はコクヨからといった感じか。

ということで、他のメーカーの同コンセプトの製品を調べてみた。

livescribe
http://www.livescribe.com/ja/

Boogie Board SYNC9.7(KING JIM)
http://www.kingjim.co.jp/sp/boogieboard/bb6.html

airpen pocket++
http://www.airpen.jp/
phree(KICK STARTER より)
http://otmtech.com/

結構ある。
いずれも、専用器具を用いて Bluetooth 等で通信する仕組み。

いずれの製品もレビューを見ると、専用ペンというのがネックのようだ。
どうやらこの分野はまだまだ発展中の様でもう暫くしないと普及しないかもしれない。

購入して開発費に貢献したいところだが、なかなか現実のお財布状況が厳しいため今一歩が踏み出せないのであった。。。

結論としては、今のところは、手書きで必要な情報を清書+スキャナが良いのかもしれない。

2015年12月5日土曜日

Xcode 7.1.1 で iOS7 のシミュレータを動かす方法

覚書として Xcode7 から、シミュレータの対応する iOS のバージョンが 8.4 以降になったようだ。
実際、iPhone4s iOS7 の組み合わせでシミュレータを実行しようとすると、
The iOS 7.1 simulator runtime is not available. Unable to open liblaunch_sim.dylib. Try reinstalling Xcode or the simulator runtime.
のエラーがでて実行できない。
Apple 自体が古い OS のサポートは切っているので、古い OS に対応したアプリなんか作るなと言うことだろうか。
確かに、古い端末をずっと使われたら商売上がったりだもんね。

とはいえ、世の中そう甘くない。
慣れ親しんだ端末をアップデートせずに使う人もいるわけで、最近では買い替え後の端末を有効利用してやろうと考える人もいる。
だから Apple よもう少し寛容になってくれ。。。
(MS なんて VB6 のサポートまだやってるんだぞ)

さて、本題だが、この状態が発生したが、自分では実機を持っているので最悪シミュレータを使用しなくても良い環境にある。
なので、調査はしたけど試してないので、どうしても必要になったら実行に移そうと思う。
参考にしたのは以下のサイト

Xcode 7 付属のシミュレータに iOS 7.1 シミュレータを登録する
http://qiita.com/msa_uccky/items/f6ed080e5d723d4c0793

How can I run the iOS 7.1 Simulator in Xcode 7.0 beta 2?
http://stackoverflow.com/questions/31056634/how-can-i-run-the-ios-7-1-simulator-in-xcode-7-0-beta-

安定の Qiita と Stackoverflow 凄いサイトだ。
この記事を読むと、エラー文にも有った liblaunch_sim.dylib が古い OS に対応していないので、Xcode7 アプリ内にある iOS7 のファイルを使用するように変更する手順が書かれている。

というかみんなどうやってこういう情報を得るのだろうか。探究心が足らないのだろうか?

最終的には以下の様にすれば良いらしい

1. 現在 /Library/Developer... にある liblaunch_sim.dylib をバックアップ
$ sudo mv "/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 7.1.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/host/liblaunch_sim.dylib"{,.bak}

2. Xcode アプリ内にある liblaunch_sim.dylib を上記の /Library/Developer... にシンボリックリンクを張る

$ sudo ln -sf "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/system/host/liblaunch_sim.dylib" "/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 7.1.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/host/liblaunch_sim.dylib"
これで、iOS7 のシミュレータが動くはず。