2015-10-08 9 views
8

Come allineare 3 UIButton s al centro di un UITableCellView?Come allineare 3 UIButtons al centro di un UITableCellView?

Per esempio dire che ho 3 UIButton s con titoli:

  1. Email
  2. Telefono
  3. Skype

E 'possibile per una o più delle UIButton s da nascondere . Ad esempio, se il telefono UIButton è nascosto, solo Email e Skype devono essere allineati al centro. Se il telefono e Skype sono nascosti, solo l'email deve essere allineata al centro.

Se uno qualsiasi dei UIButton s è nascosto, quelli visibili devono essere allineati al centro.

Voglio centrarli sia orizzontalmente che verticalmente.

+4

da allineare verticalmente ed orizzontalmente sia, o solo in verticale e mettere uno accanto saggio? – Usama

+0

stai usando xib? –

+0

Vorrei creare una sottoclasse della cella e impostare i frame dei pulsanti in layoutSubviews: – Alex

risposta

20

testato per Xcode 7:

suppongo siete alla ricerca di qualcosa di simile

enter image description here

Soluzione:

enter image description here

Passaggi:1) ciò che è necessario è una vista incapsulante che trattiene tutti e tre i pulsanti (skype, telefono, email) al centro indipendentemente dal fatto che ci sia un pulsante, due o tre al suo interno. Per questo viene creata una vista titolare che viene mostrata con sfondo verde sotto l'istantanea. enter image description here

vincoli per tale vista titolare sono

enter image description here

è solo per contenere tutte le subviews, otterrà la sua dimensione dal suo contenuto quindi non necessità di dare altezza/larghezza vincoli.

2) ora vincoli per il pulsante al centro saranno

enter image description here

3) vincoli per pulsanti su entrambi i lati sarà

enter image description here

Se è necessario nascondere qualsiasi pulsante, basta rendere costante il suo vincolo di larghezza a 0 e tutto gli altri pulsanti vengono ridisposti conseguenza

Per TableView cellulare:

@IBOutlet weak var emailButtonWidthConstraint : NSLayoutConstraint? 
    @IBOutlet weak var phoneButtonWidthConstraint : NSLayoutConstraint? 
    @IBOutlet weak var skypeButtonWidthConstraint : NSLayoutConstraint? 

    func showButtons(showSkype showSkype : Bool, showEmail : Bool, showPhone : Bool){ 
     emailButtonWidthConstraint?.constant = showEmail ? 54.0 : 0.0 
     phoneButtonWidthConstraint?.constant = showPhone ? 54.0 : 0.0 
     skypeButtonWidthConstraint?.constant = showSkype ? 54.0 : 0.0 

     self.layoutIfNeeded() 
    } 

Uso:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as? CustomCell 

     if indexPath.row == 0 { 
      cell?.showButtons(showSkype: true, showEmail: true, showPhone: true) 
     } else if indexPath.row == 1 { 
      cell?.showButtons(showSkype: false, showEmail: true, showPhone: true) 
     } else if indexPath.row == 2 { 
      cell?.showButtons(showSkype: true, showEmail: false, showPhone: true) 
     } else if indexPath.row == 3 { 
      cell?.showButtons(showSkype: true, showEmail: true, showPhone: false) 
     } else if indexPath.row == 4 { 
      cell?.showButtons(showSkype: false, showEmail: false, showPhone: true) 
     } else if indexPath.row == 5 { 
      cell?.showButtons(showSkype: false, showEmail: true, showPhone: false) 
     } else if indexPath.row == 6 { 
      cell?.showButtons(showSkype: true, showEmail: false, showPhone: false) 
     } else { 
      cell?.showButtons(showSkype: true, showEmail: true, showPhone: true) 
     } 

     return cell! 
    } 

stesso può essere raggiunto con UIStackView (senza tutto questo mal di testa, ovviamente) ma che non verrà eseguito su iOS prima del 9.0

Aggiornato (26 ottobre 2015):

GitHub Repo per il progetto di test

+0

puoi pubblicare la versione obiettivo-c della stessa? –

+0

L'implementazione per obiettivo-c sarebbe esattamente la stessa (è sufficiente modificare la sintassi) – Usama

+0

Ho problemi nell'implementazione dei vincoli. Sono nuovo nell'impaginazione automatica. Inoltre ho bisogno di un po 'di padding tra ogni pulsante. Puoi guidare nel giusto approccio? –

0

Si dovrebbe esaminare UIStackView (tuttavia, è per iOS 9 in su).

Credo che esista un metodo per UIStackViews in cui le UIViews incorporate "scompaiono" e riallinea le altre UView che sono incorporate nello stesso UIStackView.

+0

Grazie, ma sto usando ios meno di iOS9 quindi non posso usare UIStackView c'è qualche altra opzione per farlo? –

+0

Non riesco a pensare ad alcun modo per farlo tramite gli storyboard. Suggerisco di imparare come modificare i layout tramite codice. –