2015-10-21 16 views
21

Mam widok, który ma dwie etykiety i widok tabeli w środku. Chcę, aby etykieta 1 zawsze znajdowała się ponad moim widokiem tabeli i etykietą 2, poniżej widoku tabeli. Problem polega na tym, że widok tabeli wymaga automatycznego rozmiaru, co oznacza wzrost wysokości lub zmniejszenie.Ustaw wysokość UITableView na wysokość zawartości z Auto Layout

W tej chwili mam ograniczenie mówiąc, że wysokość widoku tabeli jest zawsze równa 85 i @IBOutlet do ograniczenia wysokości, gdzie jestem w stanie zmienić stałą.

Zgaduję, że muszę zmienić stałą na wysokość wszystkich komórek, ale nie jestem pewien jak.

Menu constraints

+1

Innym rozwiązaniem jest utworzenie podklasy 'UITableView', która ustawia własną' intrinsicContentSize.height' na 'contentSize.height'. Zobacz http://stackoverflow.com/a/17335818/77567. –

+0

@robmayoff odpowiedź jest lepsza moim zdaniem, ponieważ jest bardziej dynamiczna niż odpowiedź joern. – Altimac

Odpowiedz

40

Trzeba zastąpić updateViewConstraints() w UIViewController i ustawić wysokość stałą ograniczenie do tableView.contentSize.height:

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

Następnie trzeba się upewnić, że Label2 ma górną ograniczenie, które jest greaterThanOrEqual na dole widoku tabeli. Musisz także zmienić priorytet ograniczenia wysokości widoku tabeli z Required na High, aby uniknąć konfliktów z ograniczeniami, gdy widok tabeli contentHeight jest większy niż dostępna wysokość.

+0

Doskonale, dziękuję. – Dumpen

+0

Dzięki człowieku, zaoszczędzisz mi czas :) – MRustamzade

+0

Dodanie tego w widokuDidLayoutSubviews, dla mnie pracował. – GMHSJ

13

jest inne rozwiązanie. możesz dodać obserwatora do zmiennej tableize 'contentSize'. i rozmiar własny podczas zmiany zawartości widoku tabeli.

@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

To jest doskonała odpowiedź: –

+0

To jest idealna najlepsza odpowiedź: – EmilioK

+0

serdecznie zapraszamy :) – nova

Powiązane problemy