Raptor開発者ブログ

期限:2016年月日 やること:次のアプリをリリースする 資格の勉強法、アプリ開発、はてブロのカスタマイズのことを書きます!

初めてのiPhoneアプリ開発で、大変だったこと 3storyboardでautolayoutを使う

 
 
 
Xcodeでは、storyboard?InterfaceBuilder?(以下、storyboardで統一)という、視覚的にレイアウトを配置できるツールが用意されています。
さらに、storyboardのautolayoutを用いれば、どのiPhoneiPadのサイズにも自動で対応してくれます。

欠点としては、storyboardのlayoutがなかなか使いづらいという点です。
そのため、視覚的なstoryboardでなく、あえてコードのみでレイアウトをする玄人の方もいるみたいです。

せっかくXcodeを使うので、その特徴であるstoryboardを使いこなせるようになりたい!と思い、習得しました!

storyboardを使いこなすには、そこそこ学習コストがかかる、みたいな話を聞いたことがあるので、びびっていましたが、つかってみれば案外大丈夫です!
 
 
実際に、iPhone宅建アプリの、「年度四択」モードのレイアウトを、storyboardのautolayoutを使って配置してみます。

以下、画像をたくさん使った結果、かなりの長文となりましたので、ご注意ください。
 

完成図

 
f:id:raptor36:20150805090421p:plain
このようなゴールに向けて、レイアウトしていきます。
 
 
レイアウトの構造としては、ヘッダー上段にlabelを4つ横並びにし(縦サイズは20固定、横サイズは18:15、18:1、18:1、18:1)、ヘッダー下段にlabelを2つ横並びにします(縦サイズは20固定、横サイズは、9:8、9:1)。

そして、フッターにbuttonを7つ横並びにします(縦サイズは40固定、横サイズは7等分、下に広告のための50の空白を用意)。

あとは、ヘッダ〜とフッターの間にscrollviewを配置し、そのscrollviewの中にlabellを3つ縦に配置します(labelは、縦は上のviewから50の間隔、横はセンターに配置)。


label label label label
label label

scrollview
(label
label
label)

button button button button button button button
 
 
具体的にレイアウトしていきます。
 

比率による配置とscrollviewの配置

 
 
scrollviewを配置するにあたり、ヘッダーとフッターの間に配置したいので、先に、ヘッダーとフッターを配置します。
 

ヘッダーの配置

 
ヘッダー上部のlabelで一番左の配置の仕方を、少し詳しく説明します。

まずは、ヘッダーに使う計6個のlabelを適当に配置します。
f:id:raptor36:20150805090849p:plain
左上から順番に、heddaue1、heddaue2、heddaue3、heddaue4、heddasita1、heddasita2と名付けました。
 
 
そのうち、一番左のlabel(heddaue1)について、横幅を画面いっぱいの18:15の比率にしたいと思います。
 
 
まずは、横幅を画面いっぱいのサイズに合わせるため、親viewの横サイズに合わせます。
InterfaceBuilderのドキュメントアウトラインの中で、親となるViewとheddaue1をcommandキーを押して複数選択します。
f:id:raptor36:20150805091116p:plain
 
そうしたら、キャンバスの右下にあるツールバーのうち、|-□-|、こういうボタンを選択して、「EqualWidths」を選びます。
さらに、下の方にある「UpdateFrames」を、「Items of New Constraints」にします(これですぐにキャンバス上で変更が反映されます)。
f:id:raptor36:20150805092421p:plain

これをやると、さきほど適当に並べていたlabelのうち、一番左上にあったlabelが姿を消します。
f:id:raptor36:20150805092743p:plain

突然なくなってびっくりしますが、大丈夫です。

サイズの変更等があると、勝手に配置が動くためです(たいていは、座標0,0すなわち左上)。

ここから、さらにサイズを変更するので、引き続きlabelの姿がみえなくなった状態のままでいきます。
現時点では、heddaue1というlabelのサイズが、親ビューの横サイズと同じ、画面いっぱいになっているので、18:15の比率にサイズ変更します。

変更の仕方は、ドキュメントアウトラインの中で、「Constraints」を選ぶと、さきほど設定した「EqualWidths」があるので、それをクリックして選びます。
f:id:raptor36:20150805093341p:plain

その「EqualWidths」を選んだ状態で、右のユーティリティエリアのうち、右から2番目のものさしみたいなアイコンを選びます。
f:id:raptor36:20150805093630p:plain
すると、場合によっては、画像のように、「First Item」が親ビューであるSuperviewでなく、子ビューであるheddaue1がきている場合があります。
これでは、基準が親ビューでなく、子ビューとなってしまうので、「First Item」と「Second Item」を入れ替えます。
「Second Item」をクリックし、「Reverse First And Second Item」を選びます。
f:id:raptor36:20150805093930p:plain

これで、「First Item」が親ビューであるSuperviewになります。
そうしたら、18:15の比率にします(18:15はあくまで今回の私のアプリ用の比率です)。
f:id:raptor36:20150805094134p:plain
18:15と打ち込んだら、enterキーを押してください。

これを押しても、おそらくlabelの見た目のサイズは変わらないです。
そこで、変更を反映させます。
変更の反映をするには、ドキュメントアウトラインが、「Constraints」の「EqualWidths」が選択された状態になっていると思うので、それではなく、変更を反映させたいheddaue1というlabelをクリックして選びます。
f:id:raptor36:20150805094636p:plain
その状態で、キャンバスの右下にあるツールバーのうち、|-△-|、こういうボタンを選択して、selected viewの「UpdateFrames」を選びます。
f:id:raptor36:20150805094351p:plain

これで、labelのキャンバス上の見た目のサイズも18:15のサイズに変更されました。
f:id:raptor36:20150805095009p:plain
画像では一番上のオレンジと赤の線が横幅いっぱいでなく18:15になっているのがわかります。

これで、横幅を親ビューのサイズに合わせて、さらにそれを任意の比率に合わせることができました。

このままでは、labelが上の方に配置されており、クリックしてそのlableを選択することができないので、右のユーティリティエリアのうち、右から2番目のものさしみたいなアイコンをまた選びます(このものさしはホントよく使う)。
f:id:raptor36:20150805095427p:plain
とりあえず、labelを選択できる位置まで下げたいので、縦方向の座標であるY軸に100を入力しenterキーを押します。
f:id:raptor36:20150805095412p:plain

これで、labelが下がって選択することができるようになりました。
f:id:raptor36:20150805095522p:plain


あとは、このlabelを左上にぴったりと配置します。
ここからがポイントですが、あらかじめ自分が置きたい場所にぴったりと配置します。
その状態で、キャンバスの右下にあるツールバーのうち、|-□-|ボタンを選択して、上と左の|ー|を選んで赤くします。
左上にピッタリくっつけたいので、上の間隔は0にして、左の間隔は-16にします。左右にかんしては、-16が端を意味しているみたいです。
さらに、縦の幅を20に固定したいので、「Height」を20にします。
f:id:raptor36:20150805095738p:plain
先ほど、ポイントとして、あらかじめ自分が置きたい場所にぴったりと配置する、と書いた理由を説明します。
上と左の一番端にピッタリあうように、0と-16を入力すれば自動でその位置に配置されるように思えます。
しかし、その他のviewの影響を受けて、ありえない位置にいくことがあるので、あらかじめ自分が希望する位置に置きます。
これにより、予想外の位置に配置されることを防げるからです。
なので、0と-16を入力するだけで満足せず、あらかじめ自分が置きたい位置に配置した状態で行ってください。

ここまでで、labelのheddaue1を左上にピッタリくっつけることができました。
f:id:raptor36:20150805100516p:plain
 
 
ヘッダーのレイアウトに関しては、これまでの説明の通りに繰り返せば、残りの5つも配置できます。
その際に、labelの背景色を変えた方が、あらかじめ自分が置きたい位置に配置する際に、やりやすくなります。
f:id:raptor36:20150805100713p:plain

このようにヘッダーの配置ができました。
 

フッターの配置

 
フッターには7つのボタンを配置します。
f:id:raptor36:20150805100840p:plain

これも、基本的には、先ほどのヘッダーのやり方でできます。

フッターの場合は、下に広告のために50の余白を用意します。
f:id:raptor36:20150805100927p:plain

これで、レイアウトできました。
f:id:raptor36:20150805101034p:plain
 

scrollviewの配置

 
ヘッダーとフッターを配置したことで、あとはその間にscrollviewを配置します。
scrollviewの縦のサイズは、ヘッダーとフッターの間なので、先にヘッダーとフッターを配置する必要があったのです。
f:id:raptor36:20150805101321p:plain

scrollviewの横の幅は、画面いっぱいにしたいので、親ビューのサイズと同じにします。

そうしたら、scrollviewをヘッダーとフッターの間に配置します。
その際、ポイントとしては、余白がないように、上下左右00-16-16にします。
f:id:raptor36:20150805101346p:plain

これで、scrollviewがヘッダーとフッターの間いっぱいに広がりました。


あとは、labelを3つ縦に配置します。
今回のlabelは、横に関しては中央に配置したいので、キャンバスの右下にあるツールバーのうち、一番左のアイコンを選択します。
そして、「Horizontal Center in Container」にチェックを入れます。
f:id:raptor36:20150805104622p:plain
これで、横に関しては中央に配置できたので、左右の制約をこれ以上つける必要はなくなりました。

あとは、上中下のlabelのうち、上labelは、キャンバスの右下にあるツールバーのうち、|-□-|ボタンを選択して、上の部分だけ制約をつけます。ここで、上labelの下の部分にも制約をつけてしまうと、scrollviewが上labelだけに設定されてしまい、中下のlabelが広がらなくなってしまうので注意してください!
scrollviewがスクロールしない原因は、たいてい制約をつけすぎてしまうことにより起こります。

中labelも、上のみに制約をつけます。この場合の制約は、上labelからの距離を意味します。

そして、下labelは、上下に制約をつけ、上の制約は中labelからの距離で、下の制約はscrolviewに対する距離になります。
下の制約の距離は0でもいいと思いますが、テキトーに私は227にしました。
f:id:raptor36:20150805103323p:plain

これで、レイアウトが完成です。
f:id:raptor36:20150805103622p:plain
ヘッダーとフッターの間の空間が水色なのは、scrollviewを表しています。
 
 
実際に、実機で表示するとこうなります。
 
f:id:raptor36:20150805103908p:plain:w200
 
スクロールしてみると
 
f:id:raptor36:20150805103935p:plain:w200
 
ちゃんとスクロールできました!
 
 
 
これで、storyboardでautolayoutが使えるようになったと思います。
 
 


 
 
 

QLOOKアクセス解析