8

Come posso ottenere il ridisegno delle celle una volta ruotato il dispositivo?iOS - Ridisegna TableViewCells con alte celle dinamiche a rotazione

Quando eseguo il test su iPhone, l'orientamento predefinito è verticale, quindi le mie celle dinamiche sono alte quanto devono essere quando il dispositivo è in orientamento verticale: ciò significa che quando ruoto in orizzontale, c'è un sacco di spazio vuoto nella cella. Quando provo su iPad, è l'opposto. Taglio parte del mio testo quando si ruota in posizione verticale, poiché l'impostazione predefinita è paesaggio. Ho storyboard separate per entrambi i dispositivi, ed entrambi i controller di vista sono impostati su "Orientamento: dedurre"

enter image description here (ritratto) enter image description here (Paesaggio)

Questo è ciò che sta accadendo su iPhone - l'etichetta di stretching ha un buio sfondo rosso in modo da poter vedere le dimensioni reali dell'etichetta. Tuttavia, l'altezza della cella non ricalcola e poiché le etichette in basso sono vincolate al fondo della cella, sono completamente in basso da sole. Se posso aggiungere un vincolo dall'etichetta di stretching (quella con lo sfondo) al fondo della cella, non fa altro che allungare l'etichetta in questo modo:

enter image description here (Label è allungato)

cosa questo dice io sono proprio ora che non riesco a far sapere alla cellula quale sia l'orientamento e a ridisegnare una volta che si adatta alla situazione. Ecco il mio heightForRowAtIndexPath codice che sta calcolando l'altezza della cella:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (!self.opCell) 
     { 
      self.opCell = [self.container dequeueReusableCellWithIdentifier:@"OPCell"]; 
     } 
    self.opCell.opName.text = [[self.data objectAtIndex:indexPath.row] valueForKey:@"name"]; 
    [self.opCell layoutIfNeeded]; 
    CGFloat height = [self.opCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; 

    return height + 1; 
} 

Finora per farlo ruotare ho provato [self.container reloadData], in cui il contenitore è il mio TableView con willRotateToInterfaceOrientation e didRotateToInterfaceOrientation inutilmente. Ho anche provato a metterlo in viewDidLoad, in modo da poterlo rilevare e caricare quando la vista è caricata in modalità orizzontale con l'altezza corretta, ma anche questo non ha funzionato. Per iPhone, indipendentemente da ciò che faccio, carica l'altezza per la visualizzazione verticale e non si aggiorna a rotazione.

ho trovato un paio di domande che ho pensato potrebbe aiutare, ma io non riesco a ottenere this answer lavorare per me, anche se sembra che la stessa domanda che ho, e this one sembra concentrarsi maggiormente sulla larghezza della cella di altezza e non sono sicuro che si applica allo stesso modo.

Here è anche un tutorial che, quando l'ho eseguito su iPhone, non ridimensiona anche TableViewCells a rotazione.

This tutorial sembrava avere una certa comprensione a cambiare altezze da tavolo, così ho aggiunto il codice begin/endUpdates nel mio didRotateToInterfaceOrientation, pensando che potrebbe causare un cambiamento, ma questo non ha funzionato pure.

Quindi, se qualcuno ha qualche suggerimento o conosce una soluzione, sarebbe molto apprezzato, dato che sto colpendo un muro di mattoni con questo!

+0

Dovresti spostare le cose che non hanno nulla a che fare con il calcolo dell'altezza del metodo ... sarebbe un buon inizio. – nhgrif

+1

Ho bisogno di tutto il codice nel mio metodo heightForRowAtIndexPath. Devo dichiarare la cella, dichiarare il titolo che voglio rendere dinamico, quindi dirgli di calcolare l'altezza con le ultime 2 righe. Le celle dinamiche sono più difficili di quanto debbano essere e questo funziona. –

+1

Questo è un buon tutorial su come creare un tableViewCells dinamico. http://www.raywenderlich.com/73602/dynamic-table-view-cell-height-auto-layout – samir

risposta

0

Quindi ho capito il mio problema. Dopo this tutorial ho scoperto che mi mancava.

ho dovuto:

  1. sottoclasse mia etichetta che è stato stretching e stato che preferredMaxLayout è incontrare la larghezza dello schermo

  2. Nel mio heightForRowAtIndexPath ho bisogno di dire al cellulare per ottenere e aggiornare l'attuale larghezza dello schermo

Vedere il tutorial per ulteriori dettagli. Spero che questa domanda e risposta aiuti qualcuno in futuro, perché questo è stato estremamente fastidioso.

-1

È possibile utilizzare lo stesso trucco di here. Chiama:

[tableView beginUpdates]; 
[tableView endUpdates]; 

Senza niente in mezzo. Ciò attiverà il ricalcolo dell'elevazione per la vista tabella.

+0

Come ho già detto, ho già provato questo e non sto ottenendo alcun risultato. Ho provato a mettere questo metodo in 'ViewDidLoad',' viewDidLayoutSubviews', 'heightForRowAtIndexPath',' didRotateFromInterfaceOrientation' e 'reloadRowsAtIndexPath'. C'è qualche altro posto dovrei dirlo? –

+0

Mi piacerebbe solo impostare in 'didRotateFromInterfaceOrientation'. La maggior parte degli altri metodi che menzioni sono attivati ​​da 'begin' /' endUpdates' e potrebbero generare un loop. – Rivera

+0

ho provato solo lì da solo e con alcune altre posizioni, questo non funziona per me. –

1

Sembra che tu stia facendo un termino qui.Quindi, come per la mia esperienza precedente, ti suggerisco di:
1) usa sizeWithFont o la versione più recente di iOS7 con l'appropriato linebreakmode.
2) È possibile implementare layoutSubview per il proprio "opCell" in cui è possibile ridefinire la dimensione del frame.
3) Calcola l'altezza della cella durante la rotazione .. assicurati di impostare correttamente la larghezza in base ai nuovi limiti di tabelView.
4) È inoltre possibile implementare stimeHeightForRowAtIndexPath per le dimensioni stimate rapide per l'operazione di ricarica della tabella.

Spero che questo aiuti !!

+0

1) Attualmente sto ridimensionando l'etichetta semplicemente utilizzando un numero di righe pari a 0 negli storyboard e sembra che funzioni. Dovrei usare sizeWithFont in like, heightForRowAtIndexPath? questo farà solo una differenza nell'altezza dell'etichetta? e per 2 e 3 Come faccio a implementare la dimensione della cella in questi metodi se lo faccio lì piuttosto che heightForRowAtIndexPath? –

Problemi correlati