web-dev-qa-db-ja.com

iOS7:UINavigationBarの下に表示されるUICollectionView

私はしばらくiOS 7でビルドしてきましたが、まだこれを解決できていません。Storyboardで作成され、標準のUINavigationControllerで表示される、自動レイアウトが有効なビューがいくつかあります。大部分は問題ありませんが、透過性をUICollectionViewに設定しない限り、NOに基づくものは常にナビゲーションバーの下に配置されます。私はedgesExtendedトリックを試しましたが、それはそれを解決するようではない、私は必ずしも半透明性をオフにすることを気にしませんが、それをよりきれいに解決したいと思います。

18
Nicholas Smith

以前にこの問題がありました。コレクションビューのEdgeの送信数を上マージンに設定するだけです。

 [self.myCollectionVC.collectionView setContentInset:UIEdgeInsetsMake(topMargin, 0, 0, 0)];

TopMarginは、ナビゲーションバーのサイズ、またはコレクションのスクロールを開始する任意のポイントです。

このようにして、コレクションビューはナビゲーションバーのすぐ下でスクロールを開始し、同時に画面全体に表示され、ナビゲーションバーが半透明である場合に表示されます。

34
Antonio MG

参考までに、UICollectionViewがビューコントローラーの階層のルートビューであり、ビューコントローラーでautomaticallyAdjustsScrollViewInsetsがYESに設定されている場合(これがデフォルトです)、contentInsetは自動的に更新されます。

ただし、scrollviewのcontentInsetは、scrollview(またはtableview/collectionview/webview btw)がビューコントローラーの階層の最初のビューである場合にのみ自動的に更新されます。

背景画像を作成するために、UIImageViewを階層の最初に追加することがよくあります。これを行う場合は、viewDidLayoutSubviewsでスクロールビューのEdgeインセットを手動で設定する必要があります。

- (void) viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    CGFloat top = self.topLayoutGuide.length;
    CGFloat bottom = self.bottomLayoutGuide.length;
    UIEdgeInsets newInsets = UIEdgeInsetsMake(top, 0, bottom, 0);
    self.collectionView.contentInset = newInsets;

}
45
BFar

IOS 11以降にこの問題が発生しましたが、UICollectionViewのcontentInsetAdjustmentBehaviorを 決して

self.collectionView.contentInsetAdjustmentBehavior = .never
6
Davide Gianessi

私はSwiftとxcode 7.3.1を使用しています。ストーリーボードに移動し、ナビゲーションコントローラーを選択してから、[エッジの延長]と[上部のバードの下]のチェックを外します。

2
Saeid Farivar
-(void) viewDidLoad{
    [super viewDidLoad];
    self.automaticallyAdjustsScrollViewInsets = NO; //added  important
} 

- (void) viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    CGFloat top = self.topLayoutGuide.length;
    CGFloat bottom = self.bottomLayoutGuide.length;
    UIEdgeInsets newInsets = UIEdgeInsetsMake(top, 0, bottom, 0);
    self.collectionView.contentInset = newInsets;

}
0
Snail