web-dev-qa-db-ja.com

iOS 8トップレイアウトガイドの自動レイアウトの問題

IOS 8 SDKに更新すると、アプリの画面の1つが完全に壊れました。問題は、残りのビューの「アンカー」ではなく、最上位のレイアウトガイドが上にシフトすることです。

これは、iOS 7でのビューの外観です。

iOS 7 Screen

これは、iOS 8(Xcode 6の表示階層デバッガーから取得)のように見えます:

iOS 7 Screen

ご覧のとおり、ビューはナビゲーションバーの上に表示されます。上部レイアウトガイドには2つの制約があります。1つは上部の画像ビュー用で、もう1つはその下の白いビュー用です。下部のレイアウトガイドには制約はなく、ビューの高さの制約のみです。

何らかの理由で、iOS 8はトップレイアウトガイドを{0 -255; 0 0}[self.view layoutIfNeeded]が初めて呼び出されます。また、ビューの境界はデバイスに対して大きすぎる場合があります(つまり、320x480/320x568ではなく、統合されたストーリーボード(600x600)とまったく同じように表示されます)。

レイアウトを台無しにする可能性のあるiOS 8の変更点

[編集]ビューの制約の完全なリストは次のとおりです。

(lldb) po self.view.constraints
<__NSArrayM 0x786ac520>(
    <NSLayoutConstraint:0x7c377bd0 V:[_UILayoutGuide:0x7c372f60]-(0)-[UIView:0x7c373120]>,
    <NSLayoutConstraint:0x7c377c00 UIView:0x7c373120.width == UIView:0x7c3730b0.width>,
    <NSLayoutConstraint:0x7c377c30 UIView:0x7c3730b0.centerX == UIView:0x7c373120.centerX>,
    <NSLayoutConstraint:0x7c377c60 H:|-(0)-[UIView:0x7c3716f0]   (Names: '|':UIView:0x7c3730b0 )>,
    <NSLayoutConstraint:0x7c377c90 UIView:0x7c3716f0.width == UIView:0x7c3730b0.width>,
    <NSLayoutConstraint:0x7c372f30 V:[_UILayoutGuide:0x7c372f60]-(129)-[UIView:0x7c3716f0]>
)
23
David Ganster

Extend Edges > Under Top Barsは、属性インスペクターの[エッジの拡張]セクションでデフォルトでチェックされています。

Under Top Barsのチェックを外してみてください。

これは私がこのような奇妙な行動を得たときに何度も助けてくれました。

これはUIViewControllerプロパティなので、必要に応じてコードで設定できます。

Under Top Bars option in Interface Builder

43
Blacky

私はXcode 6.3.1を使用していますが、バグはそのバージョンに戻っているようです(おそらく5.1で修正されました)。 SOで回避策を見つけることができなかったので、さらにグーグルで検索する必要がありました。

iBで通常のCtrlキーを押しながらドラッグする代わりに、これを実行するビューを選択し、[エディタ]-> [ピン]-> [スーパービューの上部スペース]に移動します。

ここにソースがあります: [〜#〜] link [〜#〜] それは私の場合に役立ちました。

5
JakeP

UIBarPositionTopAttachedを使用することも、ビューの境界とフレームを使用することもできます。また、この問題を解決するのに時間がかかる Appleのドキュメント を提案してリンクすることもできます。

この問題を解決するための最良かつ最も簡単な方法は、View ControllerをNavigation Controller内に埋め込むだけです。 View Controllerを選択して、[エディター]> [埋め込み]> [Navigation Controller]に移動するだけで実行できます。(古いNavigationバーにコンテンツがある場合は、まず下にドラッグして埋め込みます。 Navigation ControllerのView Controllerを選択し、新しいNavigation Barのバーボタンを移動してから、古いNavigation Barを削除します)

[〜#〜] or [〜#〜]

ナビゲーションバーのtranslucentプロパティをNOに設定します。

self.navigationController.navigationBar.translucent = NO;

これにより、ビューがナビゲーションバーとステータスバーの下に表示されなくなります。

ナビゲーションバーを表示および非表示にする必要がある場合は、

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

viewDidLoadメソッドで。

これらのいずれかがあなたの問題を解決することを願っています。

5
Mrunal

また、そのような問題があります。 iOS8のみで実行している場合、制約を「topLayoutGuide.bottom-myView.top」から「topLayoutGuide.top-myView.top」に変更できます。しかし、それはiOS7のUIを壊します。両方のバージョンをサポートするコードでそのような回避策を作成することは可能ですが、ストーリーボードでUIを作成するときに、両方のバージョンでUIを適切に機能させることはできません。