web-dev-qa-db-de.com

sichtbarkeit der iOS-Ansicht nicht mehr

Ich bin neu in der iOS-Entwicklung. Ich möchte eine Unteransicht aus der übergeordneten Ansicht umschalten (verbergen/sichtbar machen).

In Android 

subView.setVisibility(View.GONE);

In iOS

subView.removeFromSuperview()

wenn ich die obige Funktion verwende, entferne ich subViewConstraints und verwirre meine Einschränkungen beim Scrollen.

topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = true

wenn ich den obigen Code verwende, funktioniert er gut und blendet subView aus. Wenn ich jedoch SubView sichtbar machen will, wird das SubView nicht angezeigt.

topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = false
self.view.layoutIfNeeded()

Ich hoffe, du verstehst mein Problem. Danke im Voraus.

13
John

Da ich sowohl an iOS als auch an Android gearbeitet habe, müssen Sie mit IOS spielen, um die Android-Funktion zu erreichen. iOS Unterstützt nicht automatisch die native Android-Unterstützung bei Sichtbarkeit GONE & VISIBLE 

Sie müssen die outlet der bestimmten constraint (es kann vertikal/horizontal/Höhe sein) anhängen, die Sie auf 0 setzen müssen, um Ihre Benutzeroberfläche zu verwalten.

Verstecken:

self.viewYourConstraint.constant = 0
self.yourView.hidden = true
self.view.layoutIfNeeded()

Zeigen:

self.viewYourConstraint.constant = 100//your constant value
self.yourView.hidden = false
self.view.layoutIfNeeded()

Hinweis: Wenn andere Einschränkungen durch die Aktualisierung der obigen Einschränkung betroffen sind, muss Folgendes aufgerufen werden:

self.yourView.setNeedsUpdateConstraints()

Prost

18
Mukesh

Versuchen Sie diese Erweiterung:

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
        }
    }
}

// Wie kannst du das nutzen ....

@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)

}

Hier ist das Ergebnis:

 enter image description here

8
Krunal

Sie sagen, Sie möchten Ihre Unteransicht ausblenden und den Platz entfernen, den sie einnehmen. Wenn Sie vermeiden möchten, sich mit Einschränkungen zu beschäftigen, können Sie versuchen, Stack-Ansichten zu verwenden:

  • Erstellen Sie eine UIStackView und richten Sie die entsprechenden Einschränkungen zwischen der Stapelansicht und ihrer übergeordneten Ansicht ein.
  • Fügen Sie Ansichten zur Stapelansicht hinzu.
  • Jetzt können Sie die Sichtbarkeit dieser Ansichten in der Stapelansicht umschalten, indem Sie view.isHidden auf true oder false setzen. Das Layout wird automatisch angepasst.
2
Peter

Ich glaube, Sie suchen view.isHidden = true. Dadurch wird die Ansicht einfach ausgeblendet, ohne die Ansichtshierarchie oder die Zuordnungszuordnung zu ändern. Sie können Ihre Ansicht anschließend erneut anzeigen. mit view.isHidden = false.

2
Jacob King

Vielleicht bevorzugen Sie diese Lösung 

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
            }
        }
    }
}

dann ist die Verwendung:

someView.visibility = .visible
someView.visibility = .invisible
someView.visibility = .gone
1
user7065726