contentOffset pas mis à jour sur UICollectionView si scrollToItemAtIndexPath est appelée à l'intérieur d'viewWillAppear
J'ai un UICollectionView qui est utilisé pour simuler le nouveau calendrier dans iOS 7. Cette collection de point de vue est à l'intérieur d'un contrôleur qui a une propriété selectedDate. Chaque fois que la propriété selectedDate est de définir l'affichage de la collection devrait faire défiler jusqu'à la date de l'affichage de la collection.
Le calendrier du contrôleur de viewWillAppear également s'assurer de la date sélectionnée est visible parce que ce contrôleur est mis en cache et réutilisés.
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.calendarView scrollToDate:[self selectedDate] animated:NO];
}
Le problème est que la première fois que le calendrier contrôleur est montré le défilement ne fonctionne pas. Le contentOffset de l'affichage de la collection n'est pas mis à jour.
Ma solution actuelle est de planifier le faites défiler jusqu'à se produire sur la prochaine exécution de la boucle à l'aide de
dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^(void)
{
//Scroll to the date.
});
Ça ressemble quand la UICollectionView n'est pas dans une fenêtre, vous ne pouvez pas faire défiler. La planification de la faire défiler jusqu'à arriver à la prochaine exécution de la boucle de s'assurer que le point de vue a été ajouté à la fenêtre et peut être correctement défiler.
Quelqu'un d'autre a rencontré ce problème, et de ce que leurs solutions de contournement?
- Je rencontre le même problème (ironiquement, après la construction d'un calendrier similaire de contrôle). Ma solution a été de les animer l'défiler pendant
viewDidAppear:
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez la mise en page, le problème peut être que les contraintes n'ai pas mis les images encore. Essayez d'appeler le scrollToDate: méthode viewDidLayoutSubviews (sans dispatch_after).
vous pouvez toujours la force d'auto-mise à disposition.
bilobatum's réponse est correcte!
J'écris ceci parce que je n'ai pas la réputation de commenter... :/
J'ai essayé bilobatum's réponse dans mon projet, et il a parfaitement fonctionné!
Mon code:
currentOsset est un
CGPoint
initialisé avec x = 0 et y = 999 valeurs (CGPoint currentOffset = {0,999};
)Dans le
viewWillDisappear
méthode que j'ai enregistrer le collectionView de contentOffset dans le currentOffset.De cette façon, si je navigue pour le contrôleur de collectionView et j'ai navigué là avant, je serai toujours la dernière position.
Le code qui va travailler pour vous:
Merci bilobatum pour la réponse!
Aide -viewDidLayoutSubviews créé une boucle infinie qui fait la solution trop compliquée.
Au lieu de cela j'ai juste ajouté un peu de retard pour laisser les contraintes être créé avant le défilement: