Xcode 6のアダプティブUIをiOS 7およびiOS 6と下位互換にする方法を教えてください。


137

WWDCのビデオ#216「UIKitによるアダプティブUIの構築」を見たところです。

約45:10に、Tony RicciardiがXcode 6のIBの変更について話し、新しい変更をサポートします。

彼は、「これらのドキュメントを古いバージョンのiOSに逆方向に展開できます」と述べています。

(「これらのドキュメント」とは、おそらくサイズの異なるクラスに固有の設定を持つXIBとストーリーボードを意味します。)

私はこれを作っていません。WWDCビデオをご覧ください。

そんなことがあるものか?トレイトコレクションとサイズクラスはiOS 8でのみ定義されます。iOS8の新しいUI構成に依存するランタイム動作は、以前のiOSバージョンでどのように機能しますか?

それは場合である可能それは素晴らしいだろう。iOS 6、7、8で実行するアプリを構築し、AppleがXcode 6に追加した新しい柔軟なUIレイアウト機能を利用できます。私はコードでアダプティブUIロジックを自分で作成しましたが、それはかなり仕事の。


2
バージョン8未満との互換性を説明したAppleからのドキュメントもあります
Alladinian

回答:


151

Interface Builder DOのサイズクラスでUIに加えられた変更は、iOS 7デバイスとXcodeのプレビューで正しく表示されます。たとえば、自動レイアウトの制約と通常の高さのフォントサイズを変更しました。これらの制約は、iOS 7.0を実行しているiPadシミュレーターに表示されます。

コンパクトな高さを持つサイズクラスを除き、すべてのサイズクラス最適化はiOS 7で利用できます。これはAppleによって確認されており、ドキュメントに直接記載されています

iOS 8より前のバージョンのiOSをサポートするアプリの場合、ほとんどのサイズクラスは下位互換性があります。

サイズクラスは、次の場合に下位互換性 があります。-
アプリがXcodeバージョン6以降を使用してビルドされている-アプリ
のデプロイターゲットがiOS 8より前である
-サイズクラスがストーリーボードまたはxibで指定されている
-高さコンポーネントの値がコンパクトではない

iOS 7はいくつかのサイズのクラスを尊重しないため、それらを使用すると問題が発生します。例:Compact w Any hを定義してからCompact w Compact hを定義した場合、iOS 7ではCompact w Any hが考慮されますが、iOS 8ではCompact w Compact hの外観がレンダリングされます。

したがって、これら2つのサイズクラスを利用し、iOS 7との互換性を維持したい場合は、iPhoneの横向きの任意の最適化をAny w Any hまたはCompact w Any hで実行してから、さまざまなサイズクラスの他の最適化を実行します必要に応じて、そのようにすると、コンパクトな高さのサイズクラスを使用する必要がなくなり、問題が発生するのを回避できます。


Beta4では、コンパクト/コンパクトサイズクラスがシミュレータまたはiOS 7デバイスで尊重されていないことを確認できます。興味深いことに、いくつかのサイズのクラスが尊重されています。テストをありがとう。
remmah 14

デバイスでのレギュラー/レギュラーのテストで、サイズクラスのカスタマイズに応答しない、ベータ7のAny / Anyのみが表示される
hokiewalrus

@hokiewalrus Xcode 6ベータ7で確認したところ、答えで詳しく説明したのとまったく同じ結果が得られました。レギュラーレギュラーのIBでボックスの幅を変更しても、iOS 7.1を実行しているiPadでは正しく表示されます。
ジョーダンH

3
@Joeyこれはバグではありません。これは意図的なものです。Compact-CompactiOS 7ではエクスポートされません。Compact-Regularです。詳細については、私の回答を参照してください。
Dave DeLong 2014

2
受け入れられるべき答えであるはずですが、上の答えは誤解を招くものです。
ドミニクラカイユ

68

アプリをiOS 7にデプロイすると、Xcodeは2つの異なる方法でストーリーボードをコンパイルします。

  • iPhoneの場合、ストーリーボードは「コンパクトレギュラー」(コンパクト幅、通常の高さ)としてコンパイルされ、これは「〜iphone」ペン先としてパッケージ化されます。

  • iPadの場合、ストーリーボードは「Regular-Regular」としてコンパイルされ、「〜ipad」nibとしてパッケージ化されます。

したがって、iOS 7とiOS 8の両方にデプロイする場合は、Compact-AnyおよびRegular-Anyサイズクラスに設計を集中させる必要があります。これにより、展開ターゲット間でUIを一致させるという点で最高のエクスペリエンスが得られます。もちろん、他のサイズのクラスのレイアウトを変更することもできますが、それらの変更がCompact-RegularまたはRegular-Regularサイズのクラスに適用されない限り、iOS 7ではこれらの変更は表示されません。


あなたの答えに対する私の理解は、「Regular-Regular」がiPad iOS7で動作するはずだということです。しかし、それは機能していません。XCode6 GMリリースでテストしました。私があなたの答えを誤って解釈した場合は、私を訂正してください。
Iducool 2014

4
通常のレギュラーはストーリーボードでのみ機能し、xibでは機能しないようです
Boris Charpentier

@BorisCharpentier 開いたの複製として閉じられたrdar:// 18737656に関するバグを報告しました#18490866
Maxim Pavlov

@BorisCharpentier xibの解決策を見つけましたか?
saadnib 2014

4
@BorisCharpentier、私はこの問題がXCode 6.1.1で解決されたことを発見しました:-)
saadnib

27

注:この回答はXcode 6のベータ版に関連していたため、出荷バージョンには適用されません。適切な情報については、このページのJoeyDave DeLongによる回答を参照してください。

(元の回答は以下に保持されます):


一方でStoryboards/XIBs、使用サイズのクラスに構成されたが、上で実行されますiOS 7、OSは現在、それらを尊重しないsize classesとデフォルトの「どれ/どれ」サイズクラスを使用するように見えます。

あなたが参照している特定のスライドはそのような互換性を約束しているように思われますが、現在はそうではないようです (Xcode 6 beta 2)

テストするために、Any / Anyサイズクラスの(iOS 8 SDK, deployment target of 7.1)中央vertically and horizontallyに配置されているが、Compact / Compactサイズクラスの左上隅に配置されているボタンを1つ含むプロジェクトを作成しました(例:横長のiPhone)。Xcodeのプレビューアシスタントは、ボタンの位置がでiOS 8は変更されないことを示していますiOS 7iOS 7デバイスでもこの動作を確認しました。


ロイ、返信ありがとう。これを自分でテストする時間はまだありません。感謝しています。そのビデオのプレゼンターはより明確であったはずです。私は彼がXIB / StoryboardファイルをiOS 6と7で読むことができるが、アダプティブUIのサポートなしで意味しているに違いないと思います。iOS 8未満で実行されるアプリのコーディングは問題になります。
ダンカンC

確かに。同じストーリーボード/ XIBで新しいサイズのクラスと古い方向/イディオムアプローチをサポートする方法に関する公式のドキュメントはあるのでしょうか。何か見つけたら答えを更新します。
remmah 2014年

私の経験では、Appleは古いOSバージョンが新しいバージョンを発表するとすぐに存在しなくなると考えているようです。実際、エンジニアリングチームは、新しいOSバージョンがリリースされるとすぐに注意を払うのをやめ、次のメジャーバージョンに全力を注ぎ始めるようです。現在のメジャーリリースで修正したバグを修正したことはありません。彼ら
Duncan C

3
これは、Xcode 6ベータ4には当てはまらないようです。追加した答えを参照してください。
ジョーダンH

1
@ジョーイ、頭を上げてくれてありがとう。私は読者にあなたの回答とDaveの回答を紹介するように私の回答を編集しました。
remmah 14

12

回答とコメントの一部が後方互換性の性質について議論していたので、Appleのドキュメントから直接抜粋を共有したいと思いました

~~~~~

以前のiOSバージョンでのサイズクラスを使用したアプリのデプロイ

iOS 8より前のバージョンのiOSをサポートするアプリの場合、ほとんどのサイズクラスは下位互換性があります。

サイズクラスは、次の場合に下位互換性があります。

  • アプリはXcodeバージョン6以降を使用して構築されている
  • アプリの展開ターゲットがiOS 8より前である
  • サイズクラスはストーリーボードまたはxibで指定されます
  • 高さコンポーネントの値はコンパクトではありません

~~~~~

最後の箇条書きはこの議論を対象としており、Apple は「コンパクトな高さ」が使用されていない限りこれを確認します後方互換性を維持する必要ます。

これが誰かを助けることを願っています!


これは文書化されて素晴らしいです。投稿ありがとうございます。
ジョーダンH

3

同様の問題を扱っている間に、私はここではまだ見たことのない別の答えを見つけました。XIBファイルのサイズクラスがまったく機能していないようです。storyboardファイルにセルプロトタイプを作成すると、他の回答で説明されているようにiOS7で機能しますが、同じプロトタイプセルが別のセルに移動されるとXIBファイルにれると、iOS7ではサイズクラスが無視されます。

この動作を示すサンプルプロジェクトへのリンクは次のとおりです。https//dl.dropboxusercontent.com/u/6402890/testSizeClasses.zip

プロトタイプセルには、灰色のビューの各エッジから4つの制約があります。それぞれは同じ方法で構成されます:Any / Any-10、Regular / Regular-20

ここに画像の説明を入力してください

XIBとStoryboardの両方のiOS8シミュレーターで正常に機能し、iOS7ではStoryboardで定義されたセルのみがiPadで更新された制約を取得します。

ここに画像の説明を入力してください


$ ^%$ ^%@#^&@#%&^%...そしてここにたくさんのxibファイルがあり、iOS 7および8に展開しています
TheEye

丁度。私はiPhoneとiPadのストーリーボードを1つにまとめていて、セルを独自のXIBファイルに分離すると役立つと思いました:)。私の答えを+1していただければ幸いです。
sha

1
これと同じ動作が見られます。
bjtitus 2014年

2

時間を節約できるのであれば、Xcode 6がサイズクラスに準後方互換性を提供する方法は、履歴およびサフィックス付きのストーリーボードを介したものであり、それ以上のものではないと私は信じています。サイズクラスは、以前にiPadストーリーボードとiPhoneストーリーボードを定義した方法のより抽象化された方法であるため、これは理にかなっています。~ipad~iphone

したがって:

  • サイズクラスを使用してデバイスファミリ固有のレイアウト(iPad対iPhone)をサポートすることが目的である場合は、幸運です。サイズクラスは、以前サポートされていたメソッドへのより優れたインターフェイスです。

  • サイズクラスを使用して、同じデバイスファミリ内のさまざまなモデルの変更されたレイアウトをサポートすることが目的の場合。iPhone 5/6/6 + inc。風景、あなたは運が悪いです。これらを使用するには、最小のiOS 8展開ターゲットが必要です。


1

@lducool-インターフェースビルダーのIDインスペクターで、「ビルド対象」をiOS7.1以降に変更します。


出力に違いはありません。
Iducool 2014

1

残念ながら、DaveとJoeyからの回答はうまくいきません。このスレッドでコメントすることは許可されていないので、ここが間違っている場合はご容赦ください。

私はそのための特定の質問をしました: iOS 7との下位互換性があるiPhoneポートレートランドスケープアダプティブUIの例

私がこれまでに学んだことから、私の例のように、サイズクラスに基づいてiPhone iOS7でポートレートモードとランドスケープモードの1つのui要素に対して2つの別々の異なる制約を設定することは不可能であると思います。でも、私が間違っていたら嬉しいです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.