UINavigationViewControllerの入れ子

UINavigationViewControllerを入れ子にするとどうなるのか実験してみました。

Storyboardのスクリーンショット

結果としては Container View を一枚噛ませると概ねうまくいっているようです。逆に Container View を一枚噛ませないと、元の画面から引き継いでしまうらしくイマイチな動作になるようです。

実験結果のソースコードをGithubに置いておきました。

OLYMPUS AIRを試す

普通っぽくないデジタルカメラ、OLYMPUS AIR A01を買いました。

OLYMPUS AIR A01

レンズやアクセサリーを除いた本体はとても小さくてドアノブぐらいの大きさでしょうか。撮れる写真は、スマホ内蔵カメラとはレベルが違う、高級デジタル一眼クオリティです。ちなみに、マイクロSDカードとポケット三脚は用意しておいた方が幸せになれます。

さて、発売とほぼ同時に公開されたSDKを使って、普通のカメラ使用感レポートにはない、マニア臭のする変に細かいところを見ていきたいと思います。

“OLYMPUS AIRを試す” の続きを読む

Auto Layoutで縦と横の画面切り替え #4

前回からの続きです。今回が最終回です。

レイアウトエラーがなくなった状態で、編集画面の下に表示されているサイズクラスを「Any Width  Any Height」と「Any Width Compact Height」の間で切り替えると、片方のサイズクラスにしか有効にならない制約がわかります。

img20150314_autolayout_30 img20150314_autolayout_31

これをシミュレーターで動かして画面を回転させるとそれぞれの配置で表示できているのが確認できると思います。

よく見ると実際のところ、デバイスの回転に合わせて部品が回転しながら配置されるのではなく、画面全体のサイズが変わってそれに合うように移動しているように、トランジションアニメーションしています。

デバイスが回転することとデバイスの表示サイズが変わことは別のことであって、Auto Layoutでは表示サイズの変更をサポートします、と主張しているように思えますね。Interface Builderだけでビューの座標変換行列も指定できるようになると色々と楽しそうですが、さすがにそれはまだ先でしょうか。

以上でした。

Auto Layoutで縦と横の画面切り替え #3

前回からの続きです。

縦置き用の制約と横置き用の制約が衝突しているので、それらを修正します。

ビュー階層が表示されている右上に赤いアイコンがあるのでそれをクリックすると、レイアウトエラーになった制約の一覧が表示されます。

img20150314_autolayout_21

AボタンのとCボタンの縦位置が赤いビューの中央に沿うのは、横置きでは不要なので、それぞれ実行されないようにします。(wAny hC を追加してInstalledのチェックを外します)

img20150314_autolayout_22 img20150314_autolayout_23

AボタンのとCボタンの横位置が赤いビューの左端と右端を基準にしているのは、横置きでは不要なので、それぞれ実行されないようにします。

img20150314_autolayout_24 img20150314_autolayout_25

赤いビューの高さ固定は、横置きでは不要なので、実行されないようにします。

img20150314_autolayout_26

青いビューの右端が親のビューに張り付くのは、横置きでは不要なので、実行されないようにします。

img20150314_autolayout_27

赤いビューの左端が親のビューに張り付くのは、横置きでは不要なので、実行されないようにします。

img20150314_autolayout_28

赤いビューの上端が青いビューに張り付くのは、横置きでは不要なので、実行されないようにします。

img20150314_autolayout_29

これで、すべての制約の衝突が解消され、レイアウトエラーがなくなりました。

最終回に続きます。

Auto Layoutで縦と横の画面切り替え #2

前回からの続きです。

次に、横置き用の画面を作ります。編集画面の下に表示されているサイズクラスが Any Width と Compact Height の組み合わせになるように選択しておきます。

画面の大部分を占める青い色のビューと小脇にある帯状の赤いビューを横置き用に再配置します。それぞれの大きさは、青いビューを520×400で、赤いビューを80×400にしました。

img20150314_autolayout_11 img20150314_autolayout_12

3つのボタンも横置き用に再配置します。Aボタンは下端、Bボタンは中央、Cボタンは上端です。ボタンの大きさは縦置きのままです。

img20150314_autolayout_13 img20150314_autolayout_14 img20150314_autolayout_15

次に、横置きの時にだけ使われる配置の制約を設定します。

青いビューは上端・下端・左端が親のビューに張り付きます。右端は赤のビューに張り付きます。縦置きの時と違うのは下端と右端の設定なので、その2つだけ制約を追加します。

img20150314_autolayout_16

赤いビューは上端・下端・右端が親のビューに張り付きます。幅はデバイスの画面サイズに関わらず固定です。縦置きの時と違うのは上端と幅の設定なので、その2つだけ制約を追加します。

img20150314_autolayout_17

ボタンは、横方向の位置は赤いビューの真ん中に揃えます。縦方向の位置は3つとも異なり、Aボタンは赤いビューの下端を基準、Bボタンは赤いビューの中央、Cボタンは赤いビューの上端を基準にします。いずれも、縦置きの時と違うところを制約として追加します。

img20150314_autolayout_18 img20150314_autolayout_19 img20150314_autolayout_20

横置き画面についてはここまでです。

この時点で、縦置き用の制約と横置き用の制約が衝突しているのでレイアウトエラーになっていると思います。

次回に続きます。

Auto Layoutで縦と横の画面切り替え #1

StoryboardでAuto Layoutを使って、縦置き(Portrate)と横置き(Landscape)で異なる配置の画面を作ってみます。プログラムのコードによる配置は使わずにInterface Builderの設定だけでやってみます。

img20150314_autolayout_00

iPhone 6 PlusやiPadのサイズを考慮しだすと個別の設定が複雑になるので、今回はiPhone 4SとiPhone 5のサイズのみでかつiOS 8をターゲットにします。

最初に、縦置き用の画面を作ります。編集画面の下に表示されているサイズクラスが Any Width と Any Height になっているのを確認しておきます。

画面の大部分を占める青い色のビューと小脇にある帯状の赤いビューを配置します。それぞれの大きさは、青いビューを600×520で、赤いビューを600×80にしました。

img20150314_autolayout_01 img20150314_autolayout_02

赤いビューの中にボタンを3つ配置します。Aボタンは左端、Bボタンは中央、Cボタンは右端で、ボタンの大きさは全て50×50にしました。

img20150314_autolayout_03 img20150314_autolayout_04 img20150314_autolayout_05

次に、配置の制約を設定します。

青いビューは上端・左端・右端が親のビューに張り付きます。下端は赤のビューに張り付きます。

img20150314_autolayout_06

赤いビューは下端・左端・右端が親のビューに張り付きます。高さはデバイスの画面サイズに関わらず固定です。

img20150314_autolayout_07

ボタンは、3つとも縦と横のサイズを固定にします。縦方向の位置は赤いビューの真ん中に揃えます。横方向の位置は3つとも異なり、Aボタンは赤いビューの左端を基準、Bボタンは赤いビューの中央、Cボタンは赤いビューの右端を基準にします。

img20150314_autolayout_08 img20150314_autolayout_09 img20150314_autolayout_10

縦置き画面についてはここまでです。

クラスサイズ Any での制約は、他のクラスサイズで制約が指定されていないときの保険です。今回のボタンの大きさのように、どのクラスサイズでも変わらないものについてはAnyに設定しておくのがよいと思います。

次回に続きます。

Android 5.0でWi-Fiのローカルネットワークに繋がらない

さて。「iPhoneと同じように、Androidのスマフォで、ネットへのHTTP接続は3G経由で行い、ローカルネットワークへのHTTP接続はWi-Fi経由で行う」ということがやりたい、いや、やりたかったポンコツな通信処理があったりして、そのソースコードにあまり手を入れずにAndroid 4.xに加えてAndroid 5.0をサポートできないだろうかと調査してみました。

“Android 5.0でWi-Fiのローカルネットワークに繋がらない” の続きを読む