Size ClassとUIViewController.view
公開日:
:
最終更新日:2017/02/23
Tips Storyboard, UIViewController
タイトルの件でちょっとハマったことがある上に、特に日本語情報もStackOverflowからも情報が拾えなかったので記事化してみます。
Storyboard(やxib)でUIデザインをする場合、Size Classという概念を使うことができます。
これを使うことで、特定のSize Classの場合にはレイアウト制約〜〜を使う(使わない)、といったようなSize Classをキーにしたレイアウト制約のOn/Offや、そもそものコンポーネント単位でのOn/Off(例えばiPadなどの大きなのSize Classでのみ表示されるViewなどを用意する)を制御することができます。
この前振りで、ちょっとiPhone用のアプリを作っていて、一応将来を見込んで(?)iPhone向けのSize Class(「Compact Any」のサイズ)でUIデザインをしていました。
この後、この中のラベルやらボタンのテキストをスクレイプして、UILocalizedStringでローカライズしようと目論んで、UIViewController.view.subViewsに対して、ラベルやボタンであれば、元のtextをキーにしてNSLocalizedStringでローカライズ・・・
ということをしようと思ったのです。
(StoryboardのLocalizedでやらなかったのは、ローカライズ自体は今後自分がメンテしないので、Localization.stringに全部ローカライズをまとめたかった、というのがあります)
ところが、テストすると一向にLocalizeされない・・・調べてみると、そもそもUIViewController.viewにsubviewがないことになっているのです。
そこでふと思いついて、こんな実験をしてみました。
UIViewControllerを用意する
Size Class(Any Any)に、UIViewを置く
Size Class(Compact Any)に、UIButtonを置き、先ほどのUIViewは表示しないようにする
この状態で、iPhoneシミュレータからUIViewController.viewにあるサブビューを列挙させるプログラムを実行する。
結果、見事UIViewだけを見つけてくれました(正確にはUILaybotGuideという、レイアウトガイドクラスも出ますが、関係ないので省略してます)。
つまり、コードからは(Any Any)で存在しないViewは見つけてくれないんですね。
![]()
ということで、Interface BuilderのAttribute Inspector(スライダのようなアイコン)に、Size Classごとの表示を行うかどうかのチェックボックスがあるので、これの何もないやつ(全サイズでの表示制御)をチェックして回る作業が発生したのでした。
最初からAny Anyでやればよかったんですが、iPhone前提だとあの画面サイズのサイズ感がどうも・・・と思ってしまったんですよね。最初に表示するInitial View Controllerのサイズを「iPhone〜〜」のサイズにすればよかったのですが、とんだ失敗をしてしまいした。
関連記事
-
-
実機テストしたときのデータを取り出す
Xcodeでコンパイルして実機テストしている場合に、テストデータを実機から取り出す方法です。 以下
-
-
iOS7でのPopover内サイズの指定
UIPopover内で表示する場合のViewControllerのコンテンツサイズ設定に関してのメモ
-
-
StoryboardからPopoverを作っても位置合わせコードは必要
これだけだとわかりづらいんですが。 XcodeのStoryboardから、Segueを"Prese
-
-
Xcode8で余計なログを抑制する
Xcode8に更新してから、妙にログが増えたので、NSLogで明示したのと実行時エラー以外のログを吐
-
-
Xcode10からのimage literal / color literalの指定方法
アセットにあるUIImageの直接指定が可能なImage literalですが、気がついたらアセット
-
-
NSStringのフォーマット書式
Appleのページになく、IEEEのprintfフォーマットのページにあるので、C言語と親しくしてな
-
-
Bitbucket課題の記法サンプル
Bitbucketの課題、およびwikiで利用できる記法についての記事です。 利用できる記法に
-
-
viewDidLoadとviewDidLayoutSubviewsのタイミング
真実の記事にある「コードでiPhone6を識別する」話とほんのちょっとだけ繋がっている話で、view
-
-
RealmのList
とArray の相互変換によるマップ Realm+ObjectMapperを使って、RealmのオブジェクトをJSON変換してたのですが
