2016-05-20 35 views
13

Qualcuno conosce un modo semplice per nascondere un'etichetta e lasciare che le altre viste dello schermo utilizzino il punto lasciato in bianco? E fai il contrario quando mostri quella visione. Qualcosa come Android setVisibility = GONE for layers.come impostare la visibilità GONE come Android in IOS?

Per quanto ne so, utilizzando setHidden = true nasconde la vista dallo schermo ma non riorganizza nulla attorno ad essa.

Grazie

+0

non puoi farlo in iOS proprio come Android, ma se stai usando un UIStackView puoi – Fonix

+0

Usare UIStackView come funziona? @Fonix –

+0

se si dispone di qualsiasi codice di riferimento per quanto riguarda si prega di commentare –

risposta

11

L'unico modo per ottenere la funzionalità Androids .GONE su iOS è quello di utilizzare un UIStackView

via Apples documentation

dinamicamente Modifica del Stack View Content T La vista stack aggiorna automaticamente il suo layout ogni volta che le viste vengono aggiunte, rimosse o inserite nell'array arrangedSubviews, o ogni volta che una delle proprietà nascoste delle subview viste di viene modificata.

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

Grazie per rispondi funziona perfettamente @Fonix –

+0

Risposta perfetta. –

1

È possibile utilizzare UIStackView se youe applicazione supporta iOS 9 e superiori.

ma se i vostri supporto iOS app 8 anche di quanto si deve achive utilizzando Autolayout e aggiungere altezza Vincola per View

Quindi, se si vuole nascondere che solo impostare il valore di vincolo di altezza 0.

2

È possibile raggiungere questo facilmente utilizzando vincoli di layout automatico.

Supponiamo di avere tre punti di vista come questo:

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

e si vuole fare in vista B scomparire in alcuni casi.

Impostare vincoli come segue (questi sono i valori solo esempio):

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

quindi creare una presa NSLayoutConstraint nel codice per l'altezza di B. Fai questo trascinando e rilasciando il vincolo in IB.

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

Infine, per rendere la vista sparire, basta effettuare le seguenti operazioni:

self.bHeight = 0; 

Si noti che se si sta facendo questo per una cella Tableview, si possono avere casi in cui si desidera B a comparire in alcune celle, ma non in altre.

In questo caso, sarà necessario ripristinare l'altezza al suo valore "normale" per quelle celle in cui si desidera che sia visibile.

self.bHeight = 24; 
+0

se si imposta solo 'self.bHeight = 0; 'quindi ci sarà un doppio spazio tra A e C, sarà necessario creare uno degli spazi in alto 0, altrimenti se ci sono più di 3 viste, sarà guardare irregolare – Fonix

+0

Se si utilizza ARC e hanno l'errore: > "conversione implicita di 'int' a 'NSLayoutConstraint *' non è consentita con ARC" è necessario utilizzare 'self.bHeight.constant = 24;' – Bubu

1

Stavo cercando una soluzione semplice e l'ho trovata.Non devo usare UIStackView o creare outlet per i vincoli. Basta usare questo:

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

Ora, è possibile chiamare view.gone = true e il gioco è fatto.

+0

è funziona per impostare dinamicamente il controllo della tabella? –

+1

@siddharth shah Non ho provato questo. –

+0

ok, nessun problema proverò allora risponderò grazie a @DanielQ –