2016-05-20 16 views
13

Ktoś wie, w jaki prosty sposób ukryć etykietę, a inne widoki ekranu powinny pozostawić puste miejsce? I odwróć się, pokazując ten widok. Coś jak Android setVisibility = GONE dla warstw.jak ustawić widoczność ZOSTAŁA jak Android w IOS?

Z tego co wiem, użycie setHidden = true powoduje jedynie ukrycie widoku z ekranu, ale nie zmienia niczego wokół niego.

Dziękuję

+0

Nie możesz tego zrobić w systemie iOS zupełnie jak android, ale jeśli korzystasz z UIStackView, możesz – Fonix

+0

używać UIStackView jego pracy? @Fonix –

+0

jeśli masz jakikolwiek kod referencyjny odnośnie tego, proszę komentarz –

Odpowiedz

11

Jedynym sposobem osiągnąć funkcjonalność Androidy .GONE na iOS jest użycie UIStackView

poprzez Apples documentation

Dynamicznie Zmiana stosu wyświetlanie na zawartość T widok stosu: automatycznie aktualizuje układ, gdy widoki są dodawane, usuwane lub wstawione do tablicy arranSubviews, lub gdy jedna z ukrytych właściwości ukrytych podrzędnych zmieniła się.

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

Dzięki za odpowiedź działa idealnie @Fonix –

+0

Doskonała odpowiedź. –

1

Można użyć UIStackView jeśli youe aplikacja obsługuje iOS 9 i powyżej.

ale jeśli ios app 8 również wsparcia niż Trzeba achive go za pomocą autoLayout i dodać Wysokość Powiąż z widokiem

Więc jeśli chcesz ukryć niż właśnie ustawionej wartości ograniczyć wysokość 0.

2

Można to osiągnąć łatwo za pomocą wiązań autoLayout.

Załóżmy, że masz trzy widoki tak:

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

i chcesz mieć widok B zniknie w niektórych przypadkach.

Konfigurowanie ograniczeń następująco (Są to tylko przykładowe wartości):

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

Następnie utwórz wylot NSLayoutConstraint w kodzie na wysokości B.. Zrób to, przeciągając i upuszczając ograniczenie w IB.

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

Wreszcie, aby widok zniknie, po prostu wykonaj następujące czynności:

self.bHeight = 0; 

pamiętać, że jeśli robisz to na komórce tableview może być przypadki, gdzie chcesz B, aby pojawić się w niektóre komórki, ale nie w innych.

W takim przypadku konieczne będzie zresetowanie wysokości do jej "normalnej" wartości dla komórek, w których ma być widoczna.

self.bHeight = 24; 
+0

jeśli ustawisz tylko 'self.bHeight = 0;' wtedy będzie podwójne spacje między A i C, musisz zrobić także jedną z górnych przestrzeni 0, w przeciwnym razie, jeśli są więcej niż 3 widoki, to wyglądają nierówne – Fonix

+0

Jeśli używasz łuku i ma błąd: > „niejawna konwersja z«int»do«NSLayoutConstraint *»jest niedozwolone z ARC” trzeba wykorzystać 'self.bHeight.constant = 24;' – Bubu

1

Szukałem prostego rozwiązania i znalazłem je.Nie muszę używać UIStackView ani tworzyć ujścia dla ograniczenia. Wystarczy użyć tego:

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

Teraz można zadzwonić view.gone = true i to wszystko.

+0

jest to działa, aby dynamicznie ustawić widok nagłówka tabeli? –

+1

@siddharth shah Nie przetestowałem tego. –

+0

ok, bez problemu postaram się odpowiedzieć Btw dziękuję @DanielQ –

Powiązane problemy