0
votes

Comment puis-je effondrer des uiviews par programme?

Je travaille sur ma première application iOS et je suis lancé dans une question. J'ai un interface utilisateur autoloyout programmatique assez élaboré qui répond à l'interaction de l'utilisateur. Lorsqu'un clavier est montré, certaines vues doivent être effondrées, d'autres déplacées et d'autres personnes se sont engagées en fonction de quelques conditions.

Maintenant, à l'état par défaut, aucune erreur d'autolamayout ne se produit. Mais une fois que les choses commencent à bouger, tout se sépare. Quelques-unes des problèmes concernent des images conservent leur hauteur, tandis que HeigConstrice de leur vue est réglé sur 0. Maintenant, j'ai activé .ScaletOfill. P>

J'ai examiné Stackviews, car la plupart de mes points de vue sont d'une taille différente avec différents éléments d'UI imbriqués Stackviews font maintenant la résolution de mes problèmes. Mais j'aimerais certainement une entrée à ce sujet. P>

Maintenant mes questions sont les suivantes: Comment puis-je réduire de manière dynamique et uIImageVoiries? P>

Maintenant, cela ne vous dérange pas de taper beaucoup de contraintes manuellement, tant que cela fonctionne. P>

Voici les contraintes des vues en question (il y a plus) p> xxx pré>

voici la configuration de la vue Concontrôleurs: P>

@objc func keyboardWillShowNotification(notification: Notification ) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {

        // collapse and hide bottom view
        bottomMenu.contentMode = .scaleToFill;
        bottomMenu.heightAnchor.constraint(equalToConstant: 0).isActive = true;
        bottomMenu.isHidden = true

        // collapse and hide top view
        weigtImageView.contentMode = .scaleToFill;
        weigtImageView.heightAnchor.constraint(equalToConstant: 0).isActive = true;
        weigtImageView.isHidden = true;



        // spawn my tag view
        tagController.topAnchor.constraint(equalTo: self.textView.bottomAnchor).isActive = true;
        tagController.bottomAnchor.constraint(equalTo: suggestionCloud.topAnchor).isActive = true
        tagController.isHidden = false;

        // set textviews new constraints
        textView.bottomAnchor.constraint(equalTo: tagController.topAnchor).isActive = true;
        // set middleView's new constraints
        suggestionCloud.topAnchor.constraint(equalTo: tagController.bottomAnchor).isActive = true;
        suggestionCloud.bottomAnchor.constraint(equalTo: bottomMenu.topAnchor, constant: -keyboardSize.height).isActive = true

        self.view.layoutIfNeeded()
    }
}


0 commentaires

3 Réponses :


0
votes

Si vous n'avez pas de référence forte à vos vues à publier, il suffit d'exécuter ceci:

if view2Breleased.superview != nil {
    view2Breleased.removeFromSuperview()
}


2 commentaires

Merci, qu'entendez-vous par une forte référence?


Merci pour la mise à jour



0
votes

Une chose que vous pourriez regarder est des contraintes en double.

Chaque fois que vous appelez weigtimageview.heightanchor.constraint (égaltoconstant: 0) .isactive = true Vous créez une nouvelle contrainte. Cela ne remplace pas automatiquement aucune contrainte de hauteur antérieure active.

Pour remplacer une contrainte, vous devez conserver une référence à celui-ci, la désactiver, puis l'activer une nouvelle (et l'attribuer éventuellement la variable que vous utilisez pour conserver une référence).

Vues de pile

Les vues de la pile pourraient être utiles dans votre situation, car elles effondrent automatiquement des vues qui ont ishaden définie sur true. Je pense que tant que les sous-espions directs du Stackview ont une taille de contenu intrinsèque (par exemple, des contraintes internes correctes), elles doivent être placées correctement par le stackview .


1 commentaires

Merci! Je vais donner à Sackviews un aller alors!



0
votes

Vous pouvez modifier la constante de la contrainte de l'alpoulor, comme: xxx

}

dans mon exemple, j'ai défini la constante pour moins la hauteur du cadre de la vue la hauteur, qui l'effondre efficacement.


3 commentaires

Merci, cela ressemble à une solution, mais j'ai un imbécule de vues avec des vues imbriquées. Une solution plus propre serait-elle de rendre ces éléments d'interface utilisateur dans leurs classes distinctes avec leurs propres sous-visions et définir leurs contraintes comme des propriétés sur l'instance spécifique de cette classe?


@Arneoldenhave Je ne suis pas vraiment sûr de votre avis. Si vous pouviez peut-être esquisser quelque chose, cela pourrait vous aider. De ce que je recueillons de votre commentaire, c'est que vous avez beaucoup de points de vue différents qui contiennent beaucoup de sous-espions? Si tel est le cas, il serait probablement plus propre de la sous-classe UIView et de définir tout ce type de travail là-bas.


Merci, je vais mettre à jour ma question avec quelques captures d'écran