Pregunta

Tengo una costumbre UITableViewCell que contiene varios UIButtons. posición del marco de cada botón es relativa a la anchura de la celda. Puse autoresizingMask = UIViewAutoresizingFlexibleWidth por lo que será ajustar el ancho de la celda y las posiciones del botón correctamente cuando se inicia la aplicación con el dispositivo, ya sea en modo horizontal o vertical.

El problema es cuando el dispositivo se gira de un modo a otro, los botones no se ajustan posiciones debido a que el UITableViewCell es reutilizable. En otras palabras, la célula no se inicializa basa en el nuevo ancho UITalbeView porque initWithStyle función de la célula se llama antes se hace girar el dispositivo y no se llama de nuevo después de la rotación del dispositivo. ¿Alguna sugerencia?

¿Fue útil?

Solución 2

Después de pasar horas de investigación (incluyendo mensajes en este sitio), no pude encontrar ninguna solución. Pero una bombilla se enciende de repente. La solución es muy simple. Sólo detectar si la orientación del dispositivo es el modo de paisaje o retrato y definir el ReusableCellIdentifier con un nombre diferente para cada uno.

static NSString*Identifier;

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


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];

Otros consejos

Desde UITableViewCell es también un UIView, se puede reemplazar el método setFrame. Cada vez que su vista de tabla rota, este método será llamado para todas las células.

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

    //Do your rotation stuffs here :)
} 

respuesta anterior tiene un serio problema. Debe utilizar [UIApplication sharedApplication] .statusBarOrientation en lugar de [UIDevice currebtDevice] .orientation debido a la orientación del dispositivo no tiene nada que ver con la orientación de interfaz -. Orientación del dispositivo es la rotación física basado en el acelerómetro

La respuesta marcada funciona como un encanto en las antiguas versiones de iOS. Para iOS 6.0 He utilizado el siguiente código:

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];

Usted necesitará fijar el ancho del marco células (suponiendo que la altura es igual en modo vertical y horizontal) dentro de su método cellForRowAtIndexPath. Eso es lo que está funcionando aquí. He utilizado para crear un TableViewCell personalizado con IB y siempre se inicializa para el retrato 320 px de ancho. Con la definición del marco funciona como se esperaba, incluso si la célula está "reutilizado" de cola.

- (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);
 ...
}

He tenido un problema similar y este post me ayudó. En mi caso tengo una clase personalizada declarada en un archivo separado, y en este archivo que tiene el siguiente código en 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
}

A continuación, en mi controlador de vista que acabo de implementar willAnimateRotationToInterfaceOrientation: y enviar el mensaje de reloadData a mi vista de tabla.

Con esto no tiene que tocar el método cellForRow.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top