2015-05-14 12 views
8

Używam klas wielkości w aplikacji z systemem iOS 8 i mam widok wewnątrz UITableViewCell o elastycznej szerokości. Jej układ automatycznego ograniczenia są zdefiniowane następująco:Wykryj ostateczny rozmiar układu dla widoku z elastyczną szerokością w UITableViewCell

enter image description here

Jak widać, jej szerokość waha się w zależności od szerokości urządzenia/orientacji.

Podczas drukowania jej ramki w cellForRowAtIndexPath widzę (180,0, 10,0, 400,0, 60,0) który pokazuje 400 szerokość. Ale gdy mierzę widok w symulatorze, jest on tylko 175 szeroki, który jest wzmocniony przez fakt, że zawartość mojego widoku jest obcięta (w tym miejscu rysuję pewne rzeczy).

Skąd mogę wiedzieć, że ograniczenia i subviews z UITableViewCell są w całości wykonane, aby można było przerysować elementy w moim widoku?

Aktualizacja

W cellForRowAtIndexPath robię następujące dostać komórkę:

let cell = tableView.dequeueReusableCellWithIdentifier("TimeTypeCell", forIndexPath: indexPath) as! TimeTypeCell 

let customField = customFields[indexPath.row] 

cell.fieldNameLabel.text = customField["name"] as? String 
cell.fieldValueLabel.text = customField["total"] as? String 
cell.graphData = customField["totalGraph"] as! [Double] 

cell.fieldGraph.dataSource = cell.self 
cell.fieldGraph.delegate = cell.self 

cell.fieldGraph.reloadData() //This is where the redrawing happens 
+0

spróbować viewDidLayoutSubviews –

+2

Jak rozumiem, 'viewDidLayoutSubviews' to metoda' UITableViewController'. Czy istnieje coś równoznacznego dla 'UITableViewCell'? –

Odpowiedz

13

Zadzwoń pod numer cell.contentView.layoutIfNeeded(), aby poprawnie wyświetlić widoki treści. Chociaż sama komórka powinna mieć prawidłowy rozmiar po zwrocie z tableView.dequeueReusableCellWithIdentifier(_, forIndexPath:), wygląda na to, że widok zawartości nie uruchamia natychmiast układu, więc musisz wywołać go ręcznie, jeśli potrzebujesz go w tym momencie.

+0

Wspaniały, działa. Dziękuję Ci! –

+4

Dzięki! Świetna odpowiedź! Nazwałem to z - (void) tableView: (UITableView *) tableView willDisplayCell: (UITableViewCell *) komórka forRowAtIndexPath: (NSIndexPath *) indexPath –

+1

To już nie działa. XCode 8, itp. – Joel

0

Trzeba też sprawdzić szerokość w viewWillLayoutSubviews lub viewDidLayoutSubviews.

Jeśli umieścisz println(self.tableView.frame.width) do viewDidLoad, viewWillAppear, viewDidAppear, viewWillLayoutSubviews i viewDidLayoutSubviews będziesz mógł zobaczyć szerokość jak każda metoda jest wywoływana.

+0

Widzę szerokość tabeli, a widok, o którym mowa, pokazuje prawą szerokość po kilku wywołaniach 'viewDidLayoutSubviews', ale mój problem pozostaje w tym, że muszę wiedzieć kiedy renderowanie layoutu jest kompletne, więc mogę wywołać przerysowanie według mnie. –

11

skończyło się nadrzędnym UITableViewCell.layoutSubviews metody:

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    [self.contentView layoutSubviews]; // this does the trick 
}