2011-10-20 15 views
11

Creo que va a ser una respuesta simple en torno a AutoResizingMasks, pero no puedo entender este tema.Cambia el tamaño de los encabezados de UITableView al rotar (sobre todo en el iPad)

Tengo una aplicación para iPad que muestra 2 UITableViews lado a lado. Cuando giro de Vertical a Horizontal y viceversa, las celdas de UITableView cambian de tamaño perfectamente, sobre la marcha, mientras se produce la rotación. Estoy utilizando UITableViewCellStyleSubtitle UITableViewCells (no subclasificado por ahora), y he configurado el UITableView en IB para anclar en los bordes superior, izquierdo e inferior (para el UITableView izquierdo) y para tener un ancho flexible.

estoy suministro de mi propio objeto UIView para

- (UIView *)tableView:(UITableView *)tableView 
    viewForHeaderInSection:(NSInteger)section 

Esto es lo que tengo hasta el momento (llamado como un método de clase de otra clase):

+ (UIView *)headerForTableView:(UITableView *)tv 
{ 
    // The view to return 
    UIView *headerView = [[UIView alloc] 
     initWithFrame:CGRectMake(0, 0, [tv frame].size.width, someHeight)]; 

    [headerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | 
            UIViewAutoresizingFlexibleLeftMargin | 
            UIViewAutoresizingFlexibleRightMargin]; 

    // Other layout logic... doesn't seem to be the culprit 

    // Return the HeaderView 
    return headerView; 
} 

Por lo tanto, en cualquier orientación, todo se carga como yo quiero. Después de la rotación, si llamo manualmente a reloadData o espero hasta que mi aplicación lo active o desplacé el UITableView, los headerViews cambiarán su tamaño y se mostrarán correctamente. Lo que no puedo entender es cómo configurar la propiedad AutoResizeMask correctamente para que el encabezado cambie de tamaño al igual que las celdas.

+0

No me queda claro de su pregunta: ¿es el tema que los anchos de encabezados no están cambiando con la mesa, que espera sus alturas para cambiar, o que los cambios que suceden no está siendo animado con la rotación de la mesa? –

+0

No he visto esto en mucho tiempo, pero una cosa inmediatamente saltó sobre mí en la revisión. Supongo que mi problema estaba relacionado con tener un ancho flexible Y márgenes flexibles a derecha e izquierda. ¿Quién sabe cómo predecir el comportamiento de cambio de tamaño horizontal en tal escenario? Apuesto a que la configuración de AutoResizingMask para un ancho más flexible hubiera sido la respuesta. De nuevo, sin embargo, como dije a continuación, me he movido a una solución completamente diferente. – mbm29414

Respuesta

15

No es una solución muy buena. Pero funciona:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
    [mTableView reloadData]; 
} 
+1

Es cierto que esto funcionará, pero es un poco kludgy. – mbm29414

+0

funciona como un encanto ... No es API privada ¿verdad? –

+0

todos los métodos utilizados aquí son públicos –

0

me gustaría obtener una respuesta real a esta, pero por ahora, acabo de re-trabajado mi UITableView para que mis "cabeceras" son sólo las células dentro de la tabla. Cambiar el tamaño no tiene problemas de esa manera.

+0

me trató de esta manera. Pero es difícil controlar las celdas si tiene múltiples vistas y secciones de celdas. –

5

Me enfrenté al mismo problema recientemente. El truco consistía en usar una vista personalizada como el headerView de la tabla. Anulación de layoutSubviews me permitió controlar el diseño a voluntad. A continuación hay un ejemplo.

#import "TableSectionHeader.h" 

@implementation TableSectionHeader 

- (id)initWithFrame:(CGRect)frame title:(NSString *)title 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 

     self.backgroundColor = [UIColor clearColor]; 

     // Initialization code 
     headerLabel = [[UILabel alloc] initWithFrame:frame]; 
     headerLabel.text = title; 

     headerLabel.textColor = [UIColor blackColor]; 
     headerLabel.font = [UIFont boldSystemFontOfSize:17]; 
     headerLabel.backgroundColor = [UIColor clearColor]; 

     [self addSubview:headerLabel]; 
    } 
    return self; 
} 

-(void)dealloc { 

    [headerLabel release]; 

    [super dealloc]; 
} 

-(void)layoutSubviews { 

    [super layoutSubviews]; 

    NSInteger xOffset = ((55.0f/768.0f) * self.bounds.size.width); 

    if (xOffset > 55.0f) { 
     xOffset = 55.0f; 
    } 

    headerLabel.frame = CGRectMake(xOffset, 15, self.bounds.size.width - xOffset * 2, 20); 
} 

+(UIView *) tableSectionHeaderWithText:(NSString *) text bounds:(CGRect)bounds { 
    TableSectionHeader *header = [[[TableSectionHeader alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, 40) title:text] autorelease]; 
    return header; 
} 

+(CGFloat) tableSectionHeaderHeight { 
    return 40.0; 
} 
@end 
+0

layoutsubviews trabajado – biorbnA

+0

@washfaq Excellent answer.Votando ... –

0

He creado UIView subclase en la que he utilizado limitaciones visuales para pegar la subvista a los lados de la pantalla. Y la rotación está bien.

class MLFlexibleView: UIView { 

override init(frame: CGRect) { 
    super.init(frame: frame) 

    self.addSubview(self.segmentedControl) 
    self.setUpConstraints() 
} 

func setUpConstraints() { 
    let views = ["view" : self.segmentedControl] 

    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "V:|-7-[view]-7-|", options: [], metrics: nil, views: views)) 
    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-15-[view]-15-|", options: [], metrics: nil, views: views)) 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

let segmentedControl:UISegmentedControl = { 
    let segmentedControl = UISegmentedControl(items: ["Searches".localized, "Adverts".localized]) 
    segmentedControl.selectedSegmentIndex = 0 
    segmentedControl.tintColor = UIColor.white 
    segmentedControl.translatesAutoresizingMaskIntoConstraints = false 
    return segmentedControl 
}() 

} 
Cuestiones relacionadas