2016-05-20 6 views
13

Jeder weiß eine einfache Möglichkeit, ein Label zu verbergen und die anderen Ansichten des Bildschirms verwenden Sie den Platz leer gelassen? Und machen Sie das Gegenteil, wenn Sie diese Ansicht anzeigen. So etwas wie Android setVisibility = GONE für Ebenen.Wie setzt man die Sichtbarkeit GONE wie Android in IOS?

Soweit ich weiß, verstecken Sie mit der Verwendung von setHidden = true nur die Ansicht vom Bildschirm, aber nichts um sie herum neu anordnen.

Danke

+0

Sie können dies in iOS nicht ganz wie Android, aber wenn Sie eine UIStackView verwenden, können Sie – Fonix

+0

Verwenden von UIStackView seine Arbeit? @ Fonix –

+0

Wenn Sie einen Referenzcode diesbezüglich haben, bitte Kommentar –

Antwort

11

Der einzige Weg,

aber wenn Ihre Anwendung Unterstützung ios 8 auch als Du musst es achive Automatische Anordnung mit und fügen Androids .GONE Funktionalität auf iOS zu erreichen, ist ein UIStackView

über Apples documentation

dynamisch zu verwenden, um die Stapelansicht Content T Ändern Die Stapelansicht aktualisiert automatisch ihr Layout, wenn Ansichten hinzugefügt, entfernt oder in das Array arrangedSubviews eingefügt werden, oder wenn sich eine der verdeckten Eigenschaften der verdeckten Unteransichten ändert.

SWIFT 3:

// Appears to remove the first arranged view from the stack. 
// The view is still inside the stack, it's just no longer visible, and no longer contributes to the layout. 
let firstView = stackView.arrangedSubviews[0] 
firstView.hidden = true 

SWIFT 4:

let firstView = stackView.arrangedSubviews[0] 
firstView.isHidden = true 
+0

Danke für Antwort es funktioniert perfekt @Fonix –

+0

Perfekte Antwort. –

1

Sie UIStackView wenn youe App ios 9 und höher unterstützt verwenden können. Höhe Constrain für View

Also, wenn Sie verstecken wollen als nur einstellen Höhe constrain Wert 0.

2

können Sie diese einfach mit Autolayout Einschränkungen erreichen.

Angenommen, Sie drei Ansichten wie diese haben:

+-----+ 
| A | 
+-----+ 
+-----+ 
| B | 
+-----+ 
+-----+ 
| C | 
+-----+ 

und Sie möchten Ansicht B in einigen Fällen verschwinden.

einrichten Einschränkungen wie folgt (dies sind nur Beispielwerte):

B top space to A: 4 
C top space to B: 4 
B height: 20 

Dann eine NSLayoutConstraint Steckdose in Ihrem Code für B Höhe erstellen. Führen Sie dazu die Einschränkung in IB durch Ziehen und Ablegen aus.

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bHeight; 

schließlich zu der Ansicht verschwinden zu lassen, gerade wie folgt vor:

self.bHeight = 0; 

Beachten Sie, dass, wenn Sie dies für eine Tableview Zelle tun, können Sie Fälle, wo Sie B angezeigt werden soll in einige Zellen, aber nicht in anderen.

In diesem Fall müssen Sie die Höhe auf den "normalen" Wert für die Zellen zurücksetzen, in denen sie sichtbar sein sollen.

self.bHeight = 24; 
+0

Wenn Sie 'self.bHeight = 0;' setzen, dann gibt es einen doppelten Abstand zwischen A und C, Sie müssten auch eines der oberen Leerzeichen 0 setzen, sonst werden mehr als 3 Ansichten angezeigt aussehen uneben – Fonix

+0

Wenn Sie ARC verwenden und haben den Fehler: > „Implizite Konvertierung von‚int‘auf‚NSLayoutConstraint *‘mit ARC nicht zulässig“ Sie verwenden müssen 'self.bHeight.constant = 24;' – Bubu

1

Ich suchte nach einer einfachen Lösung und fand es.Ich muss UIStackView nicht verwenden oder Outlet für Constraint erstellen. Verwenden Sie einfach das:

class GoneConstraint { 
    private var constraint: NSLayoutConstraint 
    private let prevConstant: CGFloat 

    init(constraint: NSLayoutConstraint) { 
     self.constraint = constraint 
     self.prevConstant = constraint.constant 
    } 

    func revert() { 
     self.constraint.constant = self.prevConstant 
    } 
} 


fileprivate struct AssociatedKeys { 
    static var widthGoneConstraint: UInt8 = 0 
    static var heightGoneConstraint: UInt8 = 0 
} 


@IBDesignable 
extension UIView { 

    @IBInspectable 
    var gone: Bool { 
     get { 
      return !self.isHidden 
     } 
     set { 
      update(gone: newValue) 
     } 
    } 

    weak var widthConstraint: GoneConstraint? { 
     get { 
      return objc_getAssociatedObject(self, &AssociatedKeys.heightGoneConstraint) as? GoneConstraint 
     } 
     set(newValue) { 
      objc_setAssociatedObject(self, &AssociatedKeys.widthGoneConstraint, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
     } 
    } 
    weak var heightConstraint: GoneConstraint? { 
     get { 
      return objc_getAssociatedObject(self, &AssociatedKeys.heightGoneConstraint) as? GoneConstraint 
     } 
     set(newValue) { 
      objc_setAssociatedObject(self, &AssociatedKeys.heightGoneConstraint, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
     } 
    } 

    private func update(gone: Bool) { 
     isHidden = gone 
     if gone { 
      for constr in self.constraints { 
       if constr.firstAttribute == NSLayoutAttribute.width { 
        self.widthConstraint = GoneConstraint(constraint: constr) 
       } 
       if constr.firstAttribute == NSLayoutAttribute.height { 
        self.heightConstraint = GoneConstraint(constraint: constr) 
       } 
       constr.constant = 0 
      } 
     } else { 
      widthConstraint?.revert() 
      heightConstraint?.revert() 
     } 
    } 
} 

Jetzt können Sie view.gone = true nennen und das ist es.

+0

ist es funktioniert, um Tabelle HeaderView dynamisch zu setzen? –

+1

@siddharth shah Ich habe das nicht getestet. –

+0

ok, kein Problem, ich werde versuchen, antworten Sie dann, Btw danke @DanielQ –