web-dev-qa-db-ja.com

iOS 7-navigationControllerはUIScrollViewのcontentInsetとContentOffsetを設定しています

UIScrollViewを持っています(実際にはUICollectionViewですが、おそらく問題ではありません)。 IOS 7に表示されると、Navigation ControllerはcontentInsetとcontentOffsetを望ましくない値に設定します。ステータスバーとナビゲーションバーを調整しようとしています。 contentInsetおよびcontentOffsetのgetterおよびsetterメソッドをオーバーライドし、オブジェクトにセットを受け入れるかどうかを伝えるフラグを設定することでこれを修正しましたが、より良い方法はありますか?

69

メインView Controllerでself.automaticallyAdjustsScrollViewInsets = NOを設定してみてください。

これはiOS 7で導入されたため、iOS 6以下をサポートしている場合は、iOSバージョンチェックでラップすることをお勧めします。


更新

ストーリーボードを使用している場合、選択したコントローラーの'Adjust Scroll View Insets'をチェックするだけでなく、Interface Builderでこれを行うことができます。

enter image description here

208
KDaker

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

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

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

before

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

after

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

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

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

25
Chuy47

私には2つの解決策があります:

1。

self.view = scrollView;

2。

[self.navigationController.toolbar setTranslucent:NO];
5
amazingthere

私は同じ問題を抱えています。

  1. 設定self.automaticallyAdjustsScrollViewInsets = NOビューの一部の問題を解決しましたが、どこでも解決しませんでした。

  2. 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;
        }
    }
    
2
Savvy iPhone

これで十分です

- (void)viewDidLoad {

    [super viewDidLoad];

    self.automaticallyAdjustsScrollViewInsets = NO;
0
Vlad

これにより、次の場合の両方のケースで問題が修正されます。

  1. ステータスバーを表示する
  2. ステータスバーとナビゲーションバーの表示

    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)
        }
    }
    

他の答えはあなたにとってはうまくいくかもしれませんが、私にとってはうまくいきませんでした。私のために働いたのは、ycontentOffsetviewDidLayoutSubviewsviewWillAppearプロパティを手動で設定することでした:

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調整された子コレクションビューがあり、そうでない場合がありました。正規化する方法は、毎回手動で調整することでした。コンテンツをステータスバーの下にオフセットしたいので、ステータスバーの高さを値として使用しました(コンテンツをプッシュダウンするためにマイナス)。

0
Eric F.