web-dev-qa-db-ja.com

Xcode 6アダプティブUIはiOS 7およびiOS 6とどのように後方互換性がありますか?

私はちょうどWWDCビデオ#216、「UIKitでアダプティブUIを構築する」を見ました。

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

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

(ここで、「これらのドキュメント」とは、サイズクラスごとに特定の設定を持つXIBとストーリーボードを意味するものと思われます。)

私はこれを構成していません。 WWDCビデオを見に行きます。

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

is可能であれば、それは素晴らしいでしょう。 iOS 6、7、および8で実行されるアプリを構築し、AppleがXcode 6に追加した新しい柔軟なUIレイアウト機能を活用できます。コード内でアダプティブUIロジックを自分で作成しました、それはかなりの作業です。

137
Duncan C

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

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

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との互換性を維持したい場合は、Any w Any hまたはCompact w Any hで横向きのiPhoneに必要な最適化を行い、異なるサイズクラスに対して他の最適化を実行します必要に応じて、高さの小さいサイズクラスを使用する必要がなくなり、問題が発生することを回避できます。

151
Jordan H

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

  • IPhoneの場合、ストーリーボードは「Compact-Regular」(コンパクト幅、通常の高さ)としてコンパイルされ、これが「〜iphone」ペンとしてパッケージ化されます。

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

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

68
Dave DeLong

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

(以下に元の回答を保持):


サイズクラスを使用するように構成されたStoryboards/XIBsiOS 7で実行されますが、OSは現在これらのsize classesを尊重せず、デフォルトの「Any/Any」サイズクラスを使用しているようです。

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

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

27
remmah

いくつかの答えとコメントが後方互換性の性質について議論していたので、Apple Documentationからの抜粋を直接共有すると思いました。

~~~~~

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

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

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

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

~~~~~

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

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

12
radiovisual

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

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

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

enter image description here

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

enter image description here

3
sha

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

したがって:

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

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

2
Jonathan Crooke

残念ながら、デイブとジョーイからの答えは私にはうまくいきません。このスレッドでコメントすることはできませんので、これが間違っている場合はご容赦ください。

特定の質問を作成しました: iOS 7と後方互換性のあるiPhoneポートレートランドスケープアダプティブUIの例

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

1
Tom Major

@lducool-インターフェイスビルダーのIDインスペクターで、[Builds For]をiOS7.1以降に変更します。

1
Ash R