IOS7:UINavigationControllerのUIScrollViewオフセット


126

私は現在iOS 7でアプリを移行していますが、新しいナビゲーションコントローラー/バーの管理に何時間も行き詰まっています。

以前は、ナビゲーションコントローラがあったときに、次のようなスニペットがありました。

UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];

インターフェースビルダーでは、ビューの既存のナビゲーションバーを設定することで、すべてが実際のビューのコンテンツと一致しました。

わかりましたので、今、私はインターフェイスビルダーで適切に設計する方法の手がかりがありません。私はまだ、navcontrollerを初期化するためのスニペットを持っています。ただし、MainViewControllerのインターフェイスビルダーで、ステータスバーを半透明または不透明のナビゲーションバーに設定すると、上部にオフセットが44pxになります(以下を参照)。


Interface Builder_________________________そしてその結果


ステータスバーを[なし]に設定すると、上部にオフセットはありませんが、ナビゲーションバーのためにシミュレーターのビューが小さくなるため、インターフェイスビルダーのビューの下部が切り取られます。

Interface Builder_________________________そしてその結果

私はここで何か不足していると思いますが、それについてのiOS7移行ガイドでトピックやアップル情報を見つけることができません。

ご協力いただきありがとうございます


編集

写真からわかるように、ビューの最初の子は両方のラベルを含むUIScrollViewであり、スクロールビューがない場合は問題は発生しません。UITableViewの場合にも表示されます。ラベルがUIScrollViewの外にある場合、そのラベルへのオフセットはありません。


そうでない場合はAutolayoutを使用することをお勧めします。これにより、特定のビューが画面の上部/下部/側面から設定された距離にあることを確認できます
erdekhayser

私は確かにAutolayoutを使用していませんが、それを使用しても(チェックボックスをオンにすると)問題は解決しません。
streem 2013

Autolayoutでは、ビューを所定の位置に留めるために制約を設定する必要があります。Xcodeはあなたが自動的に何を望んでいるかを知りません。
erdekhayser 2013

以前の編集を見て、問題を発見しました。残念ながら、それは最も明白な解決策ではありません。何度も説明するのではなく、YouTubeでこの動画を使用してスクロールビューの設定方法を学びました。youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be幸運を祈ります。彼が何をしているかを完全に理解するのにそれを見るのに数回かかりました。
erdekhayser 2013

回答:


286

解決策を見つけたので、コントローラーにプロパティを設定しました:

self.automaticallyAdjustsScrollViewInsets = false

私はこのプロパティの真の利点を本当に理解していません(またはデフォルト値が真である理由)

私が見つけた唯一のドキュメントはそこにありました:

更新

iOS 11 automaticallyAdjustsScrollViewInsetsでは非推奨

あなたは今使うべきです:

self.tableView.contentInsetAdjustmentBehavior = .never

また、これらのプロパティをよりよく理解するために、この質問とその回答を確認することをお勧めします


12
素晴らしい発見。ストーリーボードのUIScrollViewは本当に複雑です。Xcodeの将来のバージョンでは、Appleがそれを少しシームレスにすることを願っています。
p0lAris 2013年

4
このコードにより、UIScrollViewスクロールできなくなります。しかし、これがなければ、オフセットを取り除くことはできません。奇妙な...
怖い人

9
このフラグはストーリーボード/ペン先でもオフにできます。ビューコントローラーには[スクロールビューインセットの調整]チェックボックスがあります。私は長い間壁に頭をぶつけて、スクロールビューと自動レイアウトの問題を整理しようとしていましたが、iOS 6と7をサポートすることでさらに複雑になりました。
ニューツ2014年

2
アプリのドキュメントでは、navigationbar.translucent = YESを設定すると、navigationbarがコンテンツを押し下げられないことが通知されます。それは最大の嘘であり、この投稿までに何時間も費やしました。さらに、self.automaticallyAdjustsScrollViewInsets = NO;を設定する必要があります。この投稿を本当にありがとう!!!!!!! リンゴとリンゴ?
user779764

これにより、UIScrollViewの境界がナビゲーションバーの高さ(-64ポイント)だけ下にシフトすることがわかりました。私はこれを手動で0に上書きしましたが、UISrollViewは引き続きy軸でスクロールし、-64の仮想線に「スナップ」します。あなたの解決策はこれを解決しました。
gdbj

92

@Justafingerの答えは、私にとっても魅力的なものでした。

この設定は、インターフェイスビルダーから簡単に調整することもできます。

  1. ビューコントローラーを選択してください
  2. [属性インスペクタ]タブをクリックします
  3. [スクロールビューインセットの調整]をオフにします
  4. 楽しい!

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


ビューコントローラではなく、UIScrollViewプロパティでこのオプションを探すために費やした年齢。ありがとう!
ドミニクウィリアムズ

11

私はこれと同じ問題に遭遇していましたが、インターフェースビルダーのViewControllerにかなり奇妙なプロパティが見つかりました。「エッジの延長」チェックボックスのセットがあります。「Under Top Bars」チェックを外すと、すべてが適切にレイアウトされ始めました。


うん、これは「スクロールビューインセットの調整」よりもうまく機能した
Dmytro

2

automaticallyAdjustsScrollViewInsetsがYES(デフォルト設定)に設定されている場合、ios6とios7の間でスクロールビューの位置が一致しないため、それらを一致させるには、この設定を無効にする必要があります。ただし、ios6は、automaticAdjustsScrollViewInsetsに遭遇するとクラッシュします。そのため、ios7でオートマティックアジャストスクロールビューインセットをプログラムで変更するか、ストーリーボード/ NIBを使用してオプションをオフにする必要があります。


2

同様の問題があり、viewControllerを閉じた後、tableViewのcontentOffsetが(0、-64)に変更されました。

私の解決策は少し奇妙でした、私は他のすべての答えを試みましたが成功しませんでした、私の問題を解決した唯一のことは.xibのコントロールツリーのtableViewの位置を切り替えることでした

これは、親ビューの最初のコントロールでした。

前

ImageViewの直後にtableViewを移動し、それが機能しました。

後

テーブルビューを最初の位置に配置すると問題が発生したようで、テーブルビューを別の位置に移動すると問題が解決しました。

PD私はautoLayoutもストーリーボードも使用していません

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


この奇妙な動作に気づきました。背後にあるロジックは、scrollViewが最初の子であるときにscrollViewInsetsが自動的に調整されるということです。それ以外の場合、スクロールビューは全画面ではなくプロベイビーであるため、実際には意味がありません。
streem

1

私もこの問題に直面しています。

UIScrollView コンテンツサイズはOSによって計算され、他のサイズ、制約システムによって提供されるオリジンとして計算されます。そのため、OSに疑いがあります。

修正方法-次のコンテンツサイズを明示的に定義する必要がありますUIScrollView

  1. スクロール可能なコンテンツを埋め込むUIView(名前をに変更ContentView
  2. 制約を追加します。

ContentView.Weight = View.Weight そして ContentView.Height = View.Height

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


0

回避策は、ストーリーボードファイルを「iOS 6.1以前」として表示することです(ストーリーボードファイル->ファイルインスペクター->インターフェイスビルダードキュメント->表示)を選択します。このモードでサブビューを配置すると、オフセットが表示されます。


ええと、私はストーリーボードを使っていません。しかし、それがios6からios7の問題であるかどうかはわかりません。上記の例はiOS 7で完全に作成されています。さらに、私は質問を編集しました。
streem 2013

おもしろい...これを見て、ドキュメント要素のXIBの先頭にvariant = "6xAndEarlier"を追加できます。これは、前述のビットを反転するときの違いです。また、この問題はuiwebviewでも発生します。
swhitman 2013

0

解決策をありがとう!私は問題を解決しようと何時間も苦労しました。ナビゲーションバーが含まれていなくても問題はありませんでしたが、ViewControllerをNavigationControllerに埋め込んだ瞬間に問題が発生しました。

Adjust Scroll View InsetsUnder Top Barsのチェックを外すことで解決しました。これらはどちらもViewControllerの属性インスペクタにあります。どうもありがとう!

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