112

UIView の構造体レイアウトの下にある iOS 6/7 Delta プロパティに気付きました。

これは何のためで、AutoLayout にないのはなぜですか?

ここに画像の説明を入力

4

6 に答える 6

108

注: 少し前にこの質問に気づきましたが、NDA が解除されたため、回答を投稿するだけです。

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

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

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

さて、それは何をしますか?

Interface Builder のラベルは、このコンテキストで「デルタ」が何を意味するかについて少し不明確ですが、この機能に対応する .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 に基づいてそれを表示する方法を変更できます。これは File Inspector->Interface Builder Document (右側のバーの最初のタブ) に含まれています。

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

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

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

全体...

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

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

これを書いている時点 (8 月 21 日) では、この機能に関するドキュメントも WWDC の資料にも言及されていません。私はいろいろ試してみましたが、少し調べた結果、それが私が発見したものです。

于 2013-09-18T11:16:56.940 に答える
83

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

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

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

于 2013-09-11T15:11:19.180 に答える
30

I know this is already been answered, just adding a small variant hoping it could also help those who don't use auto layout and still want to support iOS 6.1 and earlier versions.

Read this Apple's Transition Guide - Supporting earlier version

Choose 'View as' to 'iOS 7.0 and Later'

enter image description here

Base UI for iOS 7. For iOS 6 give suitable delta value. Use preview to see how this will render in iOS 7 and iOS 6 device.

enter image description here

Quick steps:

Select each immediate children of root view individually and add 20px to its 'Y' value.

enter image description here

Then, select all immediate children collectively and give delta Y as -20px. You can also do this in batch or individually.

enter image description here

于 2013-09-24T10:28:53.483 に答える
0

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

- (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;
}
}
于 2015-07-28T18:55:00.953 に答える