UIViewの構造体レイアウトの下にあるiOS 6/7 Deltaプロパティに気づきました。
これは何のためにあり、なぜこれがAutoLayoutにないのですか?
UIViewの構造体レイアウトの下にあるiOS 6/7 Deltaプロパティに気づきました。
これは何のためにあり、なぜこれがAutoLayoutにないのですか?
回答:
これは実際には、iOS6からiOS7へのレイアウト位置間のデルタを指します。
iOS7では、一部のビューはステータスバーを非表示にしたり、ステータスバーを透明にしたりすることができ、実際にはビューの上にオーバーレイされます。したがって、iOS6でUI要素を(0.0、0.0)に配置すると、ステータスバーの下に表示されますが、iOS7ではステータスバーの下に部分的に隠れて表示されます。したがって、その場合は、ステータスバーの高さ(20.0ポイント)に一致するデルタが必要になるため、レイアウトはiOS6とiOS7で同じに見えます。
autolayoutを使用する場合、これは必要ないと思いますが、もちろん、iPad1のサポートが失われるため、現時点では多くの人がこれを認めようとはしていません。
注:この質問に少し前に気づきましたが、NDAが解除されたため、今は私の回答のみを投稿しています
お気づきかもしれませんが、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
以下の画像は、この変化を視覚的に示しています。これは非常に極端な例ですが、その能力を実証するためのものです。私は実際には、ほんの数ピクセルのデルタ変化があると期待します。
値が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資料内の言及も見つかりません。私は遊んだことがあり、少し調べた後、それを発見しました。
私はこれがすでに回答されていることを知っています。小さなレイアウトを追加するだけで、自動レイアウトを使用せずにiOS 6.1以前のバージョンをサポートしたい人にも役立つことを期待しています。
このAppleの移行ガイドを読む-以前のバージョンのサポート
「表示」を「iOS 7.0以降」に選択します
iOS 7のベースUI。iOS6の場合、適切なデルタ値を指定します。プレビューを使用して、これがiOS 7およびiOS 6デバイスでどのようにレンダリングされるかを確認します。
簡単な手順:
ルートビューの直接の子を個別に選択し、「Y」の値に20pxを追加します。
次に、直接の子をすべてまとめて選択し、デルタYを-20pxに設定します。これをバッチまたは個別に行うこともできます。
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で実行したときにデルタが適用されます
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;
}
}