2015-10-21 5 views
21

Ho una vista che ha due etichette e una vista tabella al suo interno. Voglio che l'etichetta 1 rimanga sempre sopra la mia vista tabella e l'etichetta 2, per essere al di sotto della vista tabella. Il problema è che la vista tabella ha bisogno di dimensioni automatiche che significano aumento di altezza o diminuzione.Imposta l'altezza di UITableView all'altezza del suo contenuto con Auto Layout

In questo momento ho un vincolo che dice che l'altezza della Vista tabella è sempre uguale a 85 e un @IBOutlet al vincolo di altezza in cui sono in grado di modificare la costante.

Suppongo di dover modificare la costante all'altezza di tutte le celle, ma non sono sicuro di come.

Menu constraints

+1

Un'altra soluzione è creare una sottoclasse di 'UITableView' che imposta il proprio' intrinsicContentSize.height' al suo 'contentSize.height'. Vedi http://stackoverflow.com/a/17335818/77567. –

+0

La risposta di @robmayoff è migliore a mio parere in quanto è più dinamica della risposta di joern. – Altimac

risposta

40

dovete ignorare updateViewConstraints() nella vostra UIViewController e impostare il vincolo di altezza costante di tableView.contentSize.height:

override func updateViewConstraints() { 
    super.updateViewConstraints() 
    tableHeightConstraint.constant = tableView.contentSize.height 
} 

Poi si deve fare in modo che Label2 ha un vincolo superiore che è greaterThanOrEqual nella parte inferiore della vista tabella. Inoltre, è necessario modificare la priorità del vincolo di altezza della vista tabella da Required a High per evitare vincoli in conflitto quando lo contentHeight della vista tabella è maggiore dell'altezza disponibile.

+0

Perfetto, grazie. – Dumpen

+0

Grazie amico, hai risparmiato il mio tempo :) – MRustamzade

+0

Aggiungendo questo nel viewDidLayoutSubviews, ha funzionato per me. – GMHSJ

13

c'è un'altra soluzione. puoi aggiungere osservatore sulla variabile "contentSize" di tableview. e dimensioni automatiche quando si cambia nel contenuto della vista tabella.

@IBOutlet weak var tableView: UITableView! 
@IBOutlet weak var tableHeightConstraint: NSLayoutConstraint! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.tableView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.new, context: nil) 
} 
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    tableView.layer.removeAllAnimations() 
    tableHeightConstraint.constant = tableView.contentSize.height 
    UIView.animate(withDuration: 0.5) { 
     self.updateConstraints() 
     self.layoutIfNeeded() 
    } 

} 
+0

Questa è una risposta eccellente –

+0

Questo è perfetto, la migliore risposta – EmilioK

+0

sei il benvenuto :) – nova