web-dev-qa-db-fra.com

iOS7: UICollectionView apparaissant sous UINavigationBar

Cela fait un moment que je travaille sur iOS 7, mais je n'ai pas encore résolu le problème. J'ai un certain nombre de vues avec autolayout activé créées dans Storyboard et affichées avec une UINavigationController standard. La majorité va bien, mais celles basées sur UICollectionView se placent toujours sous la barre de navigation, sauf si je règle la translucidité sur NO. J'ai essayé l'astuce edgesExtended mais cela ne semble pas résoudre le problème. Cela ne me dérange pas forcément d'avoir la translucidité désactivée, mais j'aimerais le résoudre plus propre. 

18
Nicholas Smith

J'ai déjà eu ce problème auparavant, il suffit de définir les inserts Edge de la vue de collection avec une marge supérieure:

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

Où topMargin est la taille de la barre de navigation ou le point où vous souhaitez que la collection commence à défiler.

De cette façon, la vue de votre collection commencera à défiler juste en dessous de la barre de navigation, elle remplira en même temps tout l’écran et vous le verrez si votre barre de navigation est translucide.

34
Antonio MG

Pour votre information, si UICollectionView est la vue racine dans la hiérarchie de votre contrôleur de vue et que votre contrôleur de vue a automaticallyAdjustsScrollViewInsets défini sur YES (valeur par défaut), alors contentInset doit se mettre à jour automatiquement. 

Toutefois, contentInset de scrollview n'est mis à jour automatiquement que si votre scrollview (ou tableview/collectionview/webview btw) est la première vue de la hiérarchie de leur contrôleur de vue.

J'ajoute souvent d'abord un UIImageView dans ma hiérarchie pour avoir une image de fond. Si vous faites cela, vous devez définir manuellement les incrustations Edge de la vue de défilement dans viewDidLayoutSubviews:

- (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

J'ai eu ce problème après iOS 11, il suffit de définir le contentInsetAdjustmentBehavior de UICollectionView sur jamais:

self.collectionView.contentInsetAdjustmentBehavior = .never
5
Davide Gianessi

J'utilise Swift et xcode 7.3.1. Je l'ai résolu en allant sur le story-board et en sélectionnant mon contrôleur de navigation, puis en décochant "Etendre les bords" "Sous les meilleurs bardes".

1
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