0
votes

Xcode: autolayouout / scénario avec problème uicollectionview

courte question: forte> y a-t-il une corrélation entre la fonctionnalité "View comme" sur le storyboard en Xcode et la manière dont votre application apparaît visuellement dans le simulateur?


Long Question: strong> Je travaille sur une application de planification, et dans l'application, une collectionView se trouve en haut de la zone ViewController qui vous permet de sélectionner une date à charger une planification pour que vous puissiez sélectionner demain pour planifier votre horaire, vous pouvez sélectionner aujourd'hui, hier ou des jours plus loin dans le passé ou l'avenir. P>

Dans mon projet, j'ai ce code en place pour sélectionner la date actuelle. P>

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)

        dateCollectionView.selectItem(at: IndexPath.init(item: CalendarModel.CURRENT_DAY, section: 0), animated: true, scrollPosition: .centeredHorizontally)
}


3 Réponses :


0
votes

Avez-vous essayé de nettoyer votre construction en utilisant cmd + Maj + k? Cela ne fera probablement rien mais ne pouvait pas faire mal à essayer. Également sur la deuxième capture d'écran, il n'est pas positionné de manière égale mais programmée par programme au centre, avez-vous vérifié toutes les contraintes (et encore et ne savez pas pourquoi cela changerait le style affiché mais valant une photo).


1 commentaires

Oui, j'ai essayé de nettoyer le projet, le problème persiste toujours. De plus, si vous regardez la première photo, c'est l'iPhone 11 qui est identique à la deuxième image et elle est centrée correctement. La raison est que lorsqu'un élément est sélectionné, il est automatiquement centré, et dans la vueDididappear, je sélectionne un élément. Donc, cela ne devrait pas être le problème.



0
votes

Les différents appareils du simulateur ont chacun leur propre état. Votre application peut être installée sur certaines d'entre elles et non sur d'autres, et l'état de l'application sur chacun des périphériques sur laquelle il est installé est spécifique à ce périphérique.

Cela ressemble à votre application par défaut pour afficher la date actuelle, mais elle enregistre également la date sélectionnée et utilise la prochaine fois qu'elle s'exécute. Ce serait un comportement assez raisonnable, à tout prix, donc pour des arguments disons que c'est ce que cela fait. Si vous avez exécuté votre application sur le simulateur iPhone 11 la semaine dernière, votre application a peut-être été enregistrée ce jour-là comme date sélectionnée. Lorsque vous le tournez à nouveau récemment sur d'autres périphériques où il n'a pas été installé, l'application a démarré "frais" et a choisi la date actuelle. Mais lorsque vous l'avez rencontrée sur l'iPhone 11, l'application avait déjà enregistré des données sauvegardées. Il a donc utilisé cela au lieu de revenir au comportement par défaut.

Notez que ce sera le cas même si vous reconstruisez l'application et l'avez installée à nouveau sur le simulateur iPhone 11. Lorsque vous reconstruisez l'application, Xcode installe la nouvelle application, mais laisse les données de l'Apps'Sexisting en place, comme si vous mettez à jour l'application de l'App Store. Si vous souhaitez que l'application puisse lancer comme s'il était nouvellement installé, supprimez-le du simulateur avant de vous installer.


4 commentaires

Cela fait beaucoup de sens, mais malheureusement ce n'est pas le cas ici. L'application ne permet pas de sauvegarder la date sélectionnée et de lancer la valeur par défaut de la date d'aujourd'hui. L'application a une gamme de dates. Il détient 15 jours. La date actuelle, la semaine suivante et la semaine précédente. Lors du lancement, il est toujours par défaut à la date actuelle car car il s'agit d'un planificateur quotidien, il doit toujours afficher la date actuelle. Malheureusement, l'application sur certains périphériques (selon la taille de l'écran que je choisis dans le storyboard), fait défiler jusqu'au début de la date Collectionview, même si vous pouvez le dire à la date d'aujourd'hui.


Vous pouvez le dire à sa sélection de la date d'aujourd'hui, car il met en évidence la date à laquelle la sélection est sélectionnée, et comme vous pouvez le constater, lorsqu'il fait défiler le début de la DateCollectionview, il affiche aucun élément en surbrillance. J'ai mon code publiquement posté sur GitHub si vous seriez prêt à jeter un coup d'oeil? Ce serait une aide énorme, comme je suis assez coincé ici. github.com/julianboyko/power-planner Vous pouvez trouver le code dans la classe SchedReuvc, dans le dossier ViewControlers ..


Avez-vous essayé de supprimer l'application des simulateurs affectés et de réinstaller?


J'ai en effet. Je pense que pour une raison quelconque, il y a une corrélation étrange entre la "vue" de la scénario et la façon dont l'application s'affiche sur un périphérique (simulateur et physique que j'ai testé sur mon propre téléphone aussi).



1
votes

Le problème est que vous appelez: xxx pré>

intérieur ViewWillappear () code>, à quel point auto-mise en page n'a pas encore déterminé les cadres. P >

Au lieu de cela, vous devez l'appeler après em> toutes les vues ont été définies. Commentaire-Out votre complète ViewWillappear () Code> FUNC, et essayez-le de cette façon: P>

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    dateCollectionView.selectItem(at: IndexPath.init(item: CalendarModel.CURRENT_DAY, section: 0), animated: false, scrollPosition: .centeredHorizontally)
}


5 commentaires

C'était ça. Merci beaucoup. Cela me conduisait de noix. La seule chose maintenant, est-il défilant quand la vue apparaît, ce qui est plutôt laid. Y a-t-il des travaux autour de votre tête que vous pouvez penser de sorte que l'utilisateur ne voit pas cela? Sinon, c'est bien. Mais si vous le faites, cela aiderait un groupe.


Vérifiez ma réponse un peu plus près ... animé: faux :)


Mon erreur! Je ne peux pas vous remercier assez. Sérieusement homme. Vous étiez une aide massive.


@ Julien - heureux d'être utile. Au fait ... bon travail sur votre exemple de reproductible minimal . Les gens ont tendance à mettre beaucoup trop code là-bas.


Merci j'apprécie!