Domanda

Ho un personalizzato UITableViewCell che contiene diverse UIButtons. posizione del riquadro di ciascun pulsante è relativo alla larghezza della cella. Ho impostato autoresizingMask = UIViewAutoresizingFlexibleWidth così sarà regolare la larghezza della cella e le posizioni dei pulsanti correttamente quando l'applicazione viene avviata con il dispositivo sia in modalità orizzontale o verticale.

Il problema è quando il dispositivo viene ruotato da una modalità all'altra, i pulsanti non regolare posizioni perché l'UITableViewCell è riutilizzabile. In altre parole, la cella non è inizializzato basa sulla nuova larghezza UITalbeView perché la funzione initWithStyle della cellula viene chiamato prima che il dispositivo viene ruotato e non viene chiamato nuovamente dopo la rotazione del dispositivo. Qualche suggerimento?

È stato utile?

Soluzione 2

Dopo aver trascorso ore di ricerca (inclusi messaggi in questo sito), non riuscivo a trovare alcuna soluzione. Ma una lampadina si accende all'improvviso. La soluzione è molto semplice. Basta rilevare se l'orientamento dispositivo è in modalità orizzontale o verticale e definire il ReusableCellIdentifier con un nome diverso per ciascuno.

static NSString*Identifier;

if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight) {
                Identifier= @"aCell_portrait";
            }
            else Identifier= @"DocumentOptionIdentifier_Landscape";


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];

Altri suggerimenti

Dal UITableViewCell è anche un UIView, è possibile escludere il metodo SETFRAME. Ogni volta che la visualizzazione della tabella ruota, questo metodo verrà chiamato per tutte le celle.

-(void)setFrame:(CGRect)frame
{
    [super setFrame:frame];

    //Do your rotation stuffs here :)
} 

Risposta precedente ha un problema serio. Si dovrebbe usare [UIApplication sharedApplication] .statusBarOrientation invece di [UIDevice currebtDevice] .orientation perché l'orientamento del dispositivo non ha nulla a che fare con l'orientamento di interfaccia -. Orientamento del dispositivo è la rotazione fisica basata su accelerometro

La risposta spuntata funziona come un fascino nelle vecchie versioni di iOS. Per iOS 6.0 ho usato il codice successivo:

static NSString *Identifier;
if (self.interfaceOrientation==UIInterfaceOrientationPortrait) {
    Identifier=@"aCell_portrait";
}
else {
    Identifier=@"DocumentOptionIdentifier_Landscape";
}

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];

È necessario correggere la larghezza cellule telaio (supponendo l'altezza è uguale in modalità verticale che orizzontale) all'interno del vostro metodo di cellForRowAtIndexPath. Questo è ciò che sta lavorando qui. Ho usato per creare un TableViewCell personalizzato con IB ed è sempre inizializzato per il ritratto 320 px di larghezza. Con definente il telaio funziona come previsto, anche se la cella è "riutilizzato" dalla coda.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 ...
 UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
 if (cell == nil) {
    // create cell here...
 }

 // Adjust cell frame width to be equal to tableview frame width
 cell.frame = CGRectMake(0, 0, tableView.frame.size.width, cell.frame.size.height);
 ...
}

Ho avuto un problema simile e questo post mi ha aiutato. Nel mio caso ho una classe personalizzata dichiarata in un file separato, e in questo file ho il seguente codice nel layoutSubviews:

//PORTRAIT CELL
if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && 
    [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight)
{
    //build the custom content views for portrait mode here
}
else
{
    //build the custom content views for landscape mode here
}

Quindi a mio controller di vista ho appena implemento willAnimateRotationToInterfaceOrientation: e inviare il messaggio reloadData alla mia vista tabella.

Con questo non ho toccare il metodo di cellForRow.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top