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> 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()
}
}
3 Réponses :
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() }
Merci, qu'entendez-vous par une forte référence?
Merci pour la mise à jour
Une chose que vous pourriez regarder est des contraintes en double. p>
Chaque fois que vous appelez 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). P>
Vues de pile strong> weigtimageview.heightanchor.constraint (égaltoconstant: 0) .isactive = true code> Vous créez une nouvelle contrainte. Cela ne remplace pas automatiquement aucune contrainte de hauteur antérieure active. P>
Les vues de la pile pourraient être utiles dans votre situation, car elles effondrent automatiquement des vues qui ont ishaden code> définie sur true. Je pense que tant que les sous-espions directs du
Stackview CODE> ont une taille de contenu intrinsèque (par exemple, des contraintes internes correctes), elles doivent être placées correctement par le
stackview code>. P >
Merci! Je vais donner à Sackviews un aller alors!
Vous pouvez modifier la constante de la contrainte de l'alpoulor, comme: } p> dans mon exemple, j'ai défini la constante pour moins la hauteur du cadre de la vue la hauteur, qui l'effondre efficacement. p> p>
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