Je suis en train de définir le contenu d'un UICollectionView:
[_collectionView setContentInset:UIEdgeInsetsMake(0.f, 0.f, 100.f, 0.f)];
Ensuite, je navigue par programme jusqu'au bas de UICollectionView avec cette méthode:
- (void)scrollToLastMessageAnimated:(BOOL)animated;
{
if (_messages.count == 0) { return; }
NSUInteger indexOfLastSection = _messagesBySections.count - 1;
NSInteger indexOfMessageInLastSection = [_messagesBySections[indexOfLastSection] count] - 1;
NSIndexPath *path = [NSIndexPath indexPathForItem:indexOfMessageInLastSection
inSection:indexOfLastSection];
[_collectionView scrollToItemAtIndexPath:path
atScrollPosition:UICollectionViewScrollPositionCenteredVertically
animated:animated];
}
Il fait défiler l'écran vers le bas, mais il ignore le contentInset, ce qui signifie que les dernières cellules sont sous l'insert de contenu spécifié:
L'image de gauche montre comment elle apparaît maintenant après l'affichage de la vue. Dans l'image de droite, j'ai fait défiler manuellement jusqu'au dernier message.
J'utilise AutoLayout, des idées pour expliquer cela?
MODIFIER:
Voici une capture d’écran de la configuration de l’IB:
Aujourd'hui, par hasard, j'ai découvert la solution!
Sélectionnez votre contrôleur de vue et décochez l'option "Ajuster les incrustations de vue de défilement".
Si cette option est décochée, iOS ne règle pas automatiquement vos incrustations de la vue (et probablement de ses sous-vues), ce qui m'a causé des problèmes ... Décochez-la et configurez vos incrustations de défilement comme ceci par programme:
- (void)configureInsetsOfCollectionView
{
[_collectionView setContentInset: UIEdgeInsetsMake(self.navigationController.navigationBar.bounds.size.height + [UIApplication sharedApplication].statusBarFrame.size.height + DEFAULT_SPACING, 0.f, _keyboardHeight + _toolbar.bounds.size.height + DEFAULT_SPACING, 0.f)];
[_collectionView setScrollIndicatorInsets:UIEdgeInsetsMake(self.navigationController.navigationBar.bounds.size.height + [UIApplication sharedApplication].statusBarFrame.size.height, 0.f, _keyboardHeight + _toolbar.bounds.size.height, 0.f)];
}
Si vous utilisez une présentation de flux, essayez de définir _collectionView.collectionViewLayout.sectionInset.
Vous avez défini collectionView sous la barre d’outils et ajouté des contraintes au bas de superview pour les deux vues.
Définissez les contraintes de la barre d’outils en bas, en tête et définissez la largeur et la hauteur sur une taille fixe. Pour votre collection, définissez les contraintes en haut, en bas avec la barre d’outils menant à la vue d’ensemble et à (alternative) avec une largeur fixe
CollectionView
Suivez ces étapes pour le faire fonctionner:
Vérifiez votre vue de collection et ne la placez pas sous la barre d'outils. Ajoutez ces contraintes en sélectionnant votre collectionView on Document Outline, cliquez sur ctrl et faites-la glisser vers votre vue. Une fenêtre contextuelle apparaît, maintenez la touche Maj enfoncée et sélectionnez ces contraintes.
Barre d'outils
Vérifiez le début et la fin en faisant glisser avec ctrl dans la vue. Et ajoutez une largeur et une hauteur fixes pour la barre d'outils.
-(void)viewWillAppear:(BOOL)animated
{
[collectionView reloadData];
[self scrollToLastMessageAnimated:YES];
}
Version rapide
collectionview.contentInset = UIEdgeInsetsMake(44,0,0,0)
collectionview.scrollIndicatorInsets = UIEdgeInsetsMake(44,0,0,0)
Vous pouvez définir la fonction referenceSizeForFooterInSection
dans votre classe viewController:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
return CGSize(width: view.frame.width, height: 50)
}
Il suffit de définir la hauteur à la valeur requise.