Ruotare una consuetudine UITableViewCell
-
21-09-2019 - |
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?
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
.