Interface Builder:UIViewのレイアウトiOS 6/7デルタは何のためにありますか?


回答:


83

これは実際には、iOS6からiOS7へのレイアウト位置間のデルタを指します。

iOS7では、一部のビューはステータスバーを非表示にしたり、ステータスバーを透明にしたりすることができ、実際にはビューの上にオーバーレイされます。したがって、iOS6でUI要素を(0.0、0.0)に配置すると、ステータスバーの下に表示されますが、iOS7ではステータスバーの下に部分的に隠れて表示されます。したがって、その場合は、ステータスバーの高さ(20.0ポイント)に一致するデルタが必要になるため、レイアウトはiOS6とiOS7で同じに見えます。

autolayoutを使用する場合、これは必要ないと思いますが、もちろん、iPad1のサポートが失われるため、現時点では多くの人がこれを認めようとはしていません。


27
私にとっては、私はそれは、その後、デルタY. -20セット、私は私の要素20ポイント低下のiOS 7からのiOS 6へのデルタで発見
guptron

これは、iOS 7で非常にスリムなUIProgressViewで特に便利です
Lee Probert

108

注:この質問に少し前に気づきましたが、NDAが解除されたため、今は私の回答のみを投稿しています

AutoLayoutに表示されないのはなぜですか?

お気づきかもしれませんが、iOS 7はまったく新しい外観をもたらします。UI要素の外観が変更されましたが、一部のサイズ(または一般的なメトリック)も変更されています。これにより、インターフェースの設計がiOS 7とiOS 7の両方に対応できるようになります。

Appleの公式ラインはこれを解決するためにAutoLayoutを使用することです。これにより、UI要素のレイアウトの手間が大幅に削減されます。特にビジネス上の理由でiOS 5をサポートする必要がある場合、またはインターフェイスがAutoLayoutの実装を困難にする方法で管理されている場合は特に、これを組み込むのは簡単ではありません。このように、あなたがこのニッチなカテゴリーに分類されるなら、Appleはあなたの仕事をもう少し簡単にする方法を提供したようで、そして彼らはこのiOS 6/7 Deltasを呼び出しました。

では、何をしますか?

Interface Builderのラベルは、このコンテキストでの「Delta」の意味については少し不明確ですが、この機能に対応する.xibファイルに含まれているコードはもう少し明確です。

<inset key="insetFor6xAndEarlier" minX="-50" minY="-100" maxX="-50" maxY="300"/>

キー名insetFor6xAndEarlierは、これが何をするかを明示的に示しています。iOS 7の以前のバージョンで実行する場合、UI要素の代替インセットを提供できます。たとえば、上記では次のデルタ変更を定義しています。

x: 50
y: 100
width: -100
height: 200

.xibに格納されている値は、引用符で囲まれた値に直接対応していませんが、それらの間には相関関係があります。

x: -minX
y: -minY
width: minX + maxX
height: minY + maxY

以下の画像は、この変化を視覚的に示しています。これは非常に極端な例ですが、その能力を実証するためのものです。私は実際には、ほんの数ピクセルのデルタ変化があると期待します。

iOS7ビュー

iOS6ビュー

値がiOS 6ビューの逆であることに気付くでしょう。これは、デルタが作業しているビューのタイプに関連しているためです。iOS 6用に編集している場合、iOS 7用に要素を正しく変換するためにデルタがあります(上記の例の逆)。

さまざまなスタイルを表示するために、Interface Builderが実行するOSに基づいて、Interface Builderの表示方法を変更できます。これは、次のように、ファイルインスペクタ->インターフェイスビルダードキュメント(右側のバーの最初のタブ)に含まれています。

インターフェイススタイルスイッチ

インターフェイスを手動でコーディングしたい場合、これは存在しますか?

直接ではありませんが、コード内のOSバージョンを条件付きでチェックし、それに応じて正しい位置/サイズを設定することで、同じ効果を簡単に実現できます。Delta機能はInterface Builderに存在します。コードを実行せずに条件付き配置を行う簡単な方法はなく、Interface Builderのポイントは、UIで可能な限り多くのコードを邪魔にならないようにすることです。

全体...

アップルでは、​​オートレイアウトを使用することを強くお勧めします。これにより、ほとんどの場合、作業が楽になります。これを使用できない場合(上記の理由により)、デルタは、現在のOSのメトリックに基づいてUI要素を適切に配置する柔軟性を提供します。コード内でそれらを手動で再配置する必要はありません。良い例は、ステータスバーがないことを調整することですが、他にも多くの使用例があります。

当然、iOS7以降のみを開発している場合は、この機能を知る必要はなく、発見することもできません。自動レイアウトなしでiOS7 SDKを使用してビルドするときにiOS6デバイスでアプリケーションを実行する必要がある場合にのみ、デルタが必要になります。

これを書いている時点(8月21日)では、この機能に関するドキュメントも、WWDC資料内の言及も見つかりません。私は遊んだことがあり、少し調べた後、それを発見しました。


2
WDUKに感謝します
Kamar Shad

これまでのところプロパティはありません、それは私が知る必要があったことです
Jasper

30

私はこれがすでに回答されていることを知っています。小さなレイアウトを追加するだけで、自動レイアウトを使用せずにiOS 6.1以前のバージョンをサポートしたい人にも役立つことを期待しています。

このAppleの移行ガイドを読む-以前のバージョンのサポート

「表示」を「iOS 7.0以降」に選択します

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

iOS 7のベースUI。iOS6の場合、適切なデルタ値を指定します。プレビューを使用して、これがiOS 7およびiOS 6デバイスでどのようにレンダリングされるかを確認します。

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

簡単な手順:

ルートビューの直接の子を個別に選択し、「Y」の値に20pxを追加します。

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

次に、直接の子をすべてまとめて選択し、デルタYを-20pxに設定します。これをバッチまたは個別に行うこともできます。

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


9

AutoLayoutには少なくともiOS 6.0が必要です。iOS 5.0をサポートしたい場合は、オートレイアウトを使用できません。

そして、これらのデルタは、異なるiOSバージョン(主にiOS 7および7より前のiOSバージョン)でビューの位置を調整するために使用されます。

私はこれらの値を使用して、この写真を気に入っています。 ここに画像の説明を入力してください


1
これらを変更しても何も起こりませんが、別の手順はありますか?
リサイクルスチール

ここに私の答えを参照してください@RecycledSteel:リンク
Riskov

3

iOS 6/7 Deltaの動作を確認するために、iOS 6とiOS 7の両方のデバイスで正しく表示されるSegmentedControlを使用してデモを行います。

最初に、ストーリーボードで.XibまたはViewControllerを選択します。チェックを外して使用自動レイアウトし、「選択7以降のiOSとしてビューを

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

Interface Builderキャンバスで、segmentedControlをorigin.yが20になるように配置します。iOS6 /7 Deltaでは、DeltaYに-20を選択します

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

これにより、iOS 6とiOS 7の両方のデバイスで、SegmentedControlがステータスバーの下に配置されます。

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

iOS 7ステータスバーの開発者ガイドからのもう1つの有用な引用

デルタはビューごとに個別に設定でき、期待どおりに機能します。ストーリーボードまたはペン先がiOS 6として表示するように設定されている場合、デルタを設定すると、iOS 7で実行したときに、設定されたデルタ量によってそのビューがシフトまたはサイズ変更されます。または、ストーリーボードまたはペン先が表示に設定されている場合iOS 7では、iOS 6で実行したときにデルタが適用されます


0

AutoLayoutを使用している場合、Deltaは使用できません。これを試してください(iOS6を実行するiPhone 4sでテスト済み):

- (void) viewWillLayoutSubviews {

//iOS 6 workaround offset
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) {

    self.view.clipsToBounds = YES;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenHeight = 0.0;
    screenHeight = screenRect.size.width;
    CGRect screenFrame = CGRectMake(0, -20, self.view.frame.size.width,self.view.frame.size.height+10);

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