2013-08-28 3 views
34

Używam autolayout w Xcode 5.Jak dokonać dynamicznej zmiany wysokości UITableView za pomocą funkcji autolayout?

Ustawię wysokość widoku tabeli na wartość większą niż lub równą 200px. Chcę, żeby miał dynamiczny rozmiar. Ponieważ czasami będzie miał wiele wierszy, czasami będzie miał kilka wierszy.

Ale rozmiar jest zawsze 200px. A jeśli zawartość jest większa, powinienem przewinąć w dół, aby zobaczyć niższe wiersze.

Co należy zrobić, aby uzyskać dynamiczny rozmiar widoku stołu? enter image description here

+0

można podać granice chcesz? Na przykład od 200 punktów do 400 punktów. –

+0

Właściwie nie mam ograniczeń. Ponieważ nie może być żadnych wierszy lub może być 10 wierszy. – Burak

+0

Powiedziałeś, że chcesz mieć rozmiar dynamiczny, co oznacza, że ​​zmienia się rozmiar. Jeśli stół ma 0 rzędów, których wysokości chcesz? Czy stół może zajmować cały ekran, czy też ograniczyć go do określonego rozmiaru? –

Odpowiedz

60

To jest testowane z najnowszą wersją Xcode.

1) W Xcode przejdź do storyboardu i kliknij widok stołu, aby go wybrać.

2) W panelu Narzędzia (patrz rysunek 1) upewnij się, że zdefiniowano ograniczenie dla wysokości widoku tabeli.

Table view heigth constraint

3) w widoku kontrolera, który wyświetla widok tabeli tworzą wylot tego ograniczenia:

Swift 3

@IBOutlet weak var dynamicTVHeight: NSLayoutConstraint! 

W celu C

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *dynamicTVHeight; 

4) W scenorysie wróć do ograniczenia wysokości dla UITableView i upewnij się, że ikona w prawym zmienił kolor z fioletowego na niebieski (patrz rysunek 2)

Table view heigth constraint after outlet

4) również umieścić ten kod w tym samym kontrolerze widoku:

Swift

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    tableView.reloadData() 
} 


override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    let height = min(self.view.bounds.size.height, tableView.contentSize.height) 
    dynamicTVHeight.constant = height 
    self.view.layoutIfNeeded() 
} 

Cel C

- (void)viewWillAppear:(BOOL)animated 
{ 
    // just add this line to the end of this method or create it if it does not exist 
    [self.tableView reloadData]; 
} 

-(void)viewDidLayoutSubviews 
{ 
    CGFloat height = MIN(self.view.bounds.size.height, self.tableView.contentSize.height); 
    self.dynamicTVHeight.constant = height; 
    [self.view layoutIfNeeded]; 
} 

T jego powinien rozwiązać twój problem.

Są to linki do dwóch wersji przykładowego projektu, który robi to, co chcesz, jeden do Celu C, a drugi do Swift 3. Pobierz go i przetestuj przy pomocy Xcode. Oba projekty działają z najnowszą wersją Xcode, Xcode 8.3.2.

https://github.com/jcatalan007/TestTableviewAutolayout https://github.com/jcatalan007/TestTableviewAutolayoutSwift

+0

Nie mogę znaleźć opcji Promuj do ograniczenia użytkownika w XCode 5. Ikona jest nadal fioletowa. I nie mogłem połączyć IBOutlet z ograniczeniem. – Burak

+1

Nie martw się, po prostu wykonaj IBOutlet, po tym stanie się niebieski. Jest inny sposób, aby zrobić oultet w panelu Utilities. –

+1

@Burak: przeciągnij projekt sampel i zobacz, jak to działa. –

2

Można to zrobić programowo. Koncepcja (i sam kod) jest w rzeczywistości bardzo prosta:

W metodzie updateConstraints w widoku głównym myTableView dodaj ograniczenie tak, aby wysokość myTableView była równa myTableView.contentSize.height.

Testowane na Xcode 6 kierowania iOS 7.

+1

'myTableView.contentSize.height' = 0 wewnątrz' updateConstraints' nawet jeśli tabela zawiera dane i pokazuje wiersze podczas komentowania linii ustawiającej ograniczenie równe 'myTableView.contentSize.height'. Czy zaktualizowałeś to gdziekolwiek indziej? – Crashalot

4

stworzyć swoją komórkę przez xib lub ujęć. podaj zawartość gniazda. teraz wywołaj go w CellForRowAtIndexPath. na przykład.jeśli chcesz ustawić wysokość komórki zgodnie z tekstem etykiety komentarza. enter image description here

Tak ustawić komentarzeLbl.numberOfLine = 0;

następnie w viewDidLoad

self.table.estimatedRowHeight = 44.0 ; 
self.table.rowHeight = UITableViewAutomaticDimension; 

i teraz

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
return UITableViewAutomaticDimension;} 

voila ............ to zrobiłeś ....

+11

To nie jest to, co zadał OP. OP zapytał o zmianę wysokości całego UITableView w zależności od jego zawartości. To, co opisałeś, wpływa na wysokość poszczególnych komórek. – yf526

1

Można Ctrl + Przeciągnij ograniczenie wysokości swojego UITableView do kodu źródłowego kontrolera widoku i nadaj mu nazwę. Następnie w updateViewConstraints swojego ViewController można ustawić stałą tym ograniczeniem do tableView.contentSize.height

....

@IBOutlet weak var tableViewHeightConstraint: NSLayoutConstraint? 

....

override func updateViewConstraints() { 
    super.updateViewConstraints() 
    tableViewHeightConstraint?.constant = tableView.contentSize.height 
} 
+2

'tableView.contentSize.height' = 0 wewnątrz' updateConstraints' nawet jeśli tabela zawiera dane i pokazuje wiersze podczas komentowania 'tableViewHeightConstraint? .constant = tableView.contentSize.height'. Czy zaktualizowałeś to gdziekolwiek indziej? – Crashalot