web-dev-qa-db-ja.com

IOS7:UINavigationControllerのUIScrollViewオフセット

現在、iOS 7でアプリを移行していますが、新しいnavigationcontroller/bar管理で何時間もスタックしています。

以前、Navigation Controllerがあるとき、次のようなスニペットがありました:

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

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

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


Interface Builder_________________________そして結果


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

インターフェースビルダー_________________________そして結果

私は本当にここに何かが欠けていると思いますが、iOS7 Transitions Guideでそれに関するトピックやApple情報を見つけることができません。

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


編集

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

126
streem

わかりましたので、私は解決策を見つけました、私は自分のコントローラーにプロパティを設定しました:

self.automaticallyAdjustsScrollViewInsets = false

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

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

更新

IOS 11ではautomaticallyAdjustsScrollViewInsetsは非推奨です

次を使用する必要があります。

self.tableView.contentInsetAdjustmentBehavior = .never

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

286
streem

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

この設定は、インターフェイスビルダーからも簡単に調整できることを付け加えたかっただけです。

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

enter image description here

92
Myxtic

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

11
Ben Nicholas

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

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

これは、次のような親ビューの最初のコントロールでした:

before

ImageViewの直後にtableViewを移動し、動作しました:

after

テーブルビューを最初の位置に置くことが問題の原因であり、テーブルビューを別の位置に移動すると問題が解決したようです。

P.D. autoLayoutもストーリーボードも使用していません

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

2
Chuy47

AutomaticAdjustsScrollViewInsetsをYES(デフォルト設定)に設定すると、ios6とios7のスクロールビューの位置に不一致が生じるため、一貫性を保つためにこの設定を無効にする必要があります。ただし、ios6は、自動的にAdjustsScrollViewInsetsに遭遇するとクラッシュします。そのため、ios7で条件付きでautomaticAdjustsScrollViewInsetsをプログラムで変更するか、ストーリーボード/ NIBを使用してオプションをオフにする必要があります。

2
dawid

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

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

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

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

ContentView.Weight = View.WeightおよびContentView.Height = View.Height

enter image description here

1
maslovsa

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

0
swhitman

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

スクロールビューインセットの調整およびトップバーの下のチェックを外して解決しました。これらは両方とも、ViewControllerの属性インスペクターにあります。感謝万円!

0
Jackson Gan