私はしばらくiOS 7でビルドしてきましたが、まだこれを解決できていません。Storyboardで作成され、標準のUINavigationController
で表示される、自動レイアウトが有効なビューがいくつかあります。大部分は問題ありませんが、透過性をUICollectionView
に設定しない限り、NO
に基づくものは常にナビゲーションバーの下に配置されます。私はedgesExtended
トリックを試しましたが、それはそれを解決するようではない、私は必ずしも半透明性をオフにすることを気にしませんが、それをよりきれいに解決したいと思います。
以前にこの問題がありました。コレクションビューのEdgeの送信数を上マージンに設定するだけです。
[self.myCollectionVC.collectionView setContentInset:UIEdgeInsetsMake(topMargin, 0, 0, 0)];
TopMarginは、ナビゲーションバーのサイズ、またはコレクションのスクロールを開始する任意のポイントです。
このようにして、コレクションビューはナビゲーションバーのすぐ下でスクロールを開始し、同時に画面全体に表示され、ナビゲーションバーが半透明である場合に表示されます。
参考までに、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;
}
IOS 11以降にこの問題が発生しましたが、UICollectionViewのcontentInsetAdjustmentBehaviorを 決して:
self.collectionView.contentInsetAdjustmentBehavior = .never
私はSwiftとxcode 7.3.1を使用しています。ストーリーボードに移動し、ナビゲーションコントローラーを選択してから、[エッジの延長]と[上部のバードの下]のチェックを外します。
-(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;
}