Je suis nouveau dans le développement iOS. Je souhaite basculer (masquer/afficher) une sous-vue de la vue parente. Sous Android, il existe un moyen de masquer la visibilité.
Sous Android
subView.setVisibility(View.GONE);
Dans iOS
subView.removeFromSuperview()
quand j'utilise la fonction ci-dessus, il supprime subViewConstraints et gâche mes contraintes d'affichage de défilement.
topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = true
quand j’utilise le code ci-dessus, il fonctionne bien et cache subView. Mais quand je veux rendre subView visible, il ne montre pas la subView.
topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = false
self.view.layoutIfNeeded()
J'espère que vous comprenez mon problème.Merci d'avance.
Comme j'ai travaillé à la fois sur iOS et Android, vous devez jouer avec la sortie contrainte dans iOS pour obtenir le fonctionnement d'Android. iOS ne prend pas automatiquement en charge la prise en charge native native comme celle d'Android sur la visibilité GONE
& VISIBLE
Vous devez accrocher la outlet
de constraint
particulière (elle peut être verticale/horizontale/hauteur), vous devez la définir sur 0
et devez gérer votre interface utilisateur.
Cacher:
self.viewYourConstraint.constant = 0
self.yourView.hidden = true
self.view.layoutIfNeeded()
Montrer:
self.viewYourConstraint.constant = 100//your constant value
self.yourView.hidden = false
self.view.layoutIfNeeded()
Remarque: Si d'autres contraintes sont affectées en raison de la mise à jour de la contrainte ci-dessus, vous devez également appeler les éléments suivants:
self.yourView.setNeedsUpdateConstraints()
À votre santé
Essayez cette extension:
extension UIView {
func visiblity(gone: Bool, dimension: CGFloat = 0.0, attribute: NSLayoutAttribute = .height) -> Void {
if let constraint = (self.constraints.filter{$0.firstAttribute == attribute}.first) {
constraint.constant = gone ? 0.0 : dimension
self.layoutIfNeeded()
self.isHidden = gone
}
}
}
// Comment utiliser ça ....
@IBOutlet weak var testView: UIView?
@IBAction func testVisibilty(switchbutton: UISwitch) -> Void {
let viewHeight:CGFloat = switchbutton.isOn ? 100 : 0.0
self.testView?.visiblity(gone: !switchbutton.isOn, dimension: viewHeight)
// set visibility for width constraint
//let viewWidth:CGFloat = switchbutton.isOn ? 300 : 0.0
//self.testView?.visiblity(gone: !switchbutton.isOn, dimension: viewWidth, attribute: .width)
}
Voici le résultat:
Vous dites que vous souhaitez masquer votre sous-vue et supprimer l’espace qu’elle occupe. Si vous voulez éviter de jouer avec les contraintes, vous pouvez utiliser des vues de pile:
UIStackView
et configurez les contraintes appropriées entre la vue de pile et sa vue parent;view.isHidden
sur true ou false, et la présentation sera ajustée automatiquement.Je crois que vous recherchez view.isHidden = true
. Cela masque simplement la vue en place sans modifier la hiérarchie des vues ni le mappage des contraintes. Vous pouvez ensuite afficher à nouveau votre vue. avec view.isHidden = false
.
Peut-être préféreriez-vous cette solution
extension UIView {
enum Visibility {
case visible
case invisible
case gone
}
var visibility: Visibility {
get {
let constraint = (self.constraints.filter{$0.firstAttribute == .height && $0.constant == 0}.first)
if let constraint = constraint, constraint.isActive {
return .gone
} else {
return self.isHidden ? .invisible : .visible
}
}
set {
if self.visibility != newValue {
self.setVisibility(newValue)
}
}
}
private func setVisibility(_ visibility: Visibility) {
let constraint = (self.constraints.filter{$0.firstAttribute == .height && $0.constant == 0}.first)
switch visibility {
case .visible:
constraint?.isActive = false
self.isHidden = false
break
case .invisible:
constraint?.isActive = false
self.isHidden = true
break
case .gone:
if let constraint = constraint {
constraint.isActive = true
} else {
let constraint = NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1, constant: 0)
self.addConstraint(constraint)
constraint.isActive = true
}
}
}
}
alors l'utilisation est:
someView.visibility = .visible
someView.visibility = .invisible
someView.visibility = .gone