UIScrollViewを持っています(実際にはUICollectionViewですが、おそらく問題ではありません)。 IOS 7に表示されると、Navigation ControllerはcontentInsetとcontentOffsetを望ましくない値に設定します。ステータスバーとナビゲーションバーを調整しようとしています。 contentInsetおよびcontentOffsetのgetterおよびsetterメソッドをオーバーライドし、オブジェクトにセットを受け入れるかどうかを伝えるフラグを設定することでこれを修正しましたが、より良い方法はありますか?
メインView Controllerでself.automaticallyAdjustsScrollViewInsets = NO
を設定してみてください。
これはiOS 7
で導入されたため、iOS 6
以下をサポートしている場合は、iOSバージョンチェックでラップすることをお勧めします。
更新
ストーリーボードを使用している場合、選択したコントローラーの'Adjust Scroll View Insets'
をチェックするだけでなく、Interface Builderでこれを行うことができます。
同様の問題がありました。viewControllerを閉じた後、tableViewのcontentOffsetが(0、-64)に変更されました。
私の解決策は少し奇妙で、他のすべての答えを試しましたが、成功しませんでした。私の問題を解決した唯一のことは、.xibのコントロールツリーでtableViewの位置を切り替えることでした
これは、次のような親ビューの最初のコントロールでした:
ImageViewの直後にtableViewを移動し、動作しました:
テーブルビューを最初の位置に置くことが問題の原因であり、テーブルビューを別の位置に移動すると問題が解決したようです。
P.D. autoLayoutもストーリーボードも使用していません
これが誰かを助けることを願っています!
私には2つの解決策があります:
1。
self.view = scrollView;
2。
[self.navigationController.toolbar setTranslucent:NO];
私は同じ問題を抱えています。
設定self.automaticallyAdjustsScrollViewInsets = NO
ビューの一部の問題を解決しましたが、どこでも解決しませんでした。
2番目の解決策は、viewWillLayoutSubviewsでtableview/view/scrollviewのコンテンツオフセットを設定することです。
- (void)viewWillLayoutSubviews {
//Arrange the view
CGRect tempViewFrame = self.view.frame;
if (tempViewFrame.Origin.y == 64.0f) {
tempViewFrame.Origin.y = 0;
self.view.frame = tempViewFrame;
}
}
これで十分です
- (void)viewDidLoad {
[super viewDidLoad];
self.automaticallyAdjustsScrollViewInsets = NO;
これにより、次の場合の両方のケースで問題が修正されます。
ステータスバーとナビゲーションバーの表示
override func viewDidLayoutSubviews() {
NSLog("Origin: \(self.view.frame.Origin.y)")
if self.view.frame.Origin.y == 0 {
if let rect = self.navigationController?.navigationBar.frame {
let y = rect.size.height + rect.Origin.y
self.tableView.contentInset = UIEdgeInsetsMake(y, 0, 0, 0)
}
} else if self.view.frame.Origin.y == 44 || self.view.frame.Origin.y == 64 {
self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
}
}
他の答えはあなたにとってはうまくいくかもしれませんが、私にとってはうまくいきませんでした。私のために働いたのは、y
とcontentOffset
のviewDidLayoutSubviews
のviewWillAppear
プロパティを手動で設定することでした:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Set the offset to go below the status bar
collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Set the offset to go below the status bar
collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height
}
私の場合、コントローラーにはcontentOffset
調整された子コレクションビューがあり、そうでない場合がありました。正規化する方法は、毎回手動で調整することでした。コンテンツをステータスバーの下にオフセットしたいので、ステータスバーの高さを値として使用しました(コンテンツをプッシュダウンするためにマイナス)。