2015-05-14 7 views
8

Sto utilizzando le classi di dimensioni in un'app iOS 8 solo e ho una vista all'interno di uno UITableViewCell con larghezza flessibile. Suoi vincoli di layout automatico sono definiti come segue:Rileva dimensioni layout finale per visualizzazione con larghezza flessibile in UITableViewCell

enter image description here

Come si può vedere, la sua larghezza varia in funzione della larghezza del dispositivo/orientamento.

Quando stampo sua struttura in cellForRowAtIndexPath vedo (180.0, 10.0, 400.0, 60.0) che mostra una 400 Larghezza. Ma quando misuro la vista nel simulatore, è solo 175 largo, il che è rafforzato dal fatto che il contenuto della mia vista viene troncato (disegno alcune cose al suo interno).

Come è possibile sapere quando i contrappunti e le sottoview di UITableViewCell sono stati completati in modo che sia possibile ridisegnare elementi all'interno della visualizzazione?

Aggiornamento

In cellForRowAtIndexPath sto facendo quanto segue per ottenere il cellulare:

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

viewDidLayoutSubviews Try –

+2

Da quanto ho capito, 'viewDidLayoutSubviews' è un metodo di' UITableViewController'. C'è qualcosa di equivalente per 'UITableViewCell'? –

risposta

13

Chiama il numero cell.contentView.layoutIfNeeded() per visualizzare correttamente il contenuto. Mentre la cella stessa deve avere le dimensioni corrette quando viene restituita da tableView.dequeueReusableCellWithIdentifier(_, forIndexPath:), sembra che la vista del contenuto non esegua immediatamente il layout, quindi è necessario chiamarlo manualmente se ne hai bisogno fino a quel momento.

+0

Brillante, funziona. Grazie! –

+4

Grazie !!!! Bella risposta! Ho chiamato questo da - (void) tableView: (UITableView *) tableView willDisplayCell: (UITableViewCell *) cella forRowAtIndexPath: (NSIndexPath *) indexPath –

+1

Questo non sembra funzionare più. XCode 8, ecc. – Joel

0

è necessario o controllare la larghezza in viewWillLayoutSubviews o viewDidLayoutSubviews.

Se mettete println(self.tableView.frame.width) in viewDidLoad, viewWillAppear, viewDidAppear, viewWillLayoutSubviews, e viewDidLayoutSubviews sarete in grado di vedere la larghezza di ogni metodo viene chiamato.

+0

Riesco a vedere la larghezza della tabella e la vista in questione mostra la larghezza corretta dopo alcune chiamate a 'viewDidLayoutSubviews', ma il mio problema rimane nel fatto che ho bisogno di sapere quando il rendering del layout è completo, così posso attivare un ridisegno secondo me. –

11

ho finito con il metodo prioritario UITableViewCell.layoutSubviews:

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