web-dev-qa-db-fra.com

la visibilité de la vue iOS a disparu

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.

13
John

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é

18
Mukesh

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:

 enter image description here

8
Krunal

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:

  • Créez une UIStackView et configurez les contraintes appropriées entre la vue de pile et sa vue parent;
  • Ajouter des vues à la vue de la pile;
  • Vous pouvez maintenant basculer la visibilité de ces vues à l'intérieur de la vue de pile en définissant view.isHidden sur true ou false, et la présentation sera ajustée automatiquement.
2
Peter

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.

2
Jacob King

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
1
user7065726