web-dev-qa-db-fra.com

UICollectionView with ContentInset ne défile pas complètement

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é:

enter image description here 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:enter image description here

12
Ben Marten

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".

enter image description here

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)];
}
29
Ben Marten

Si vous utilisez une présentation de flux, essayez de définir _collectionView.collectionViewLayout.sectionInset.

8
Arjuna

Problème possible

Vous avez défini collectionView sous la barre d’outils et ajouté des contraintes au bas de superview pour les deux vues.

Solution

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

Mettre à jour

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.

CollectionView Constraints

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.

Toolbar Constraints

Traiter avec le défilement avant la vue

-(void)viewWillAppear:(BOOL)animated
{
    [collectionView reloadData];
    [self scrollToLastMessageAnimated:YES];
}
2
EridB

Version rapide

collectionview.contentInset = UIEdgeInsetsMake(44,0,0,0)
collectionview.scrollIndicatorInsets = UIEdgeInsetsMake(44,0,0,0)
2
Yoni Katz

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.

1
T. Christiansen