Auto-resize les en-têtes UITableView en rotation (principalement sur iPad)

Je pense que cela va être une réponse simple tournant autour de AutoResizingMasks, mais je ne peux pas sembler envelopper ma tête autour de ce sujet.

J'ai une application pour iPad qui affiche deux UITableViews côte à côte. Lorsque je passe de Portrait à Paysage et inversement, les cellules de l'UITableView se redimensionnent parfaitement, à la volée, pendant la rotation. J'utilise UITableViewCellStyleSubtitle UITableViewCells (non sous-classé pour l'instant), et j'ai placé UITableView dans IB pour ancrer aux bords supérieur, gauche et inférieur (pour le UITableView gauche) et pour avoir une largeur flexible.

Je fournis mon propre object UIView pour

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

Voici ce que j'ai jusqu'ici (appelé comme une méthode de class d'une autre class):

 + (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; } 

Donc, dans les deux sens, tout se charge comme je veux. Après la rotation, si j'appelle manuellement reloadData ou si j'attends que mon application le triggers ou fasse défiler le UITableView, les headerViews vont se resize et se montrer correctement. Ce que je n'arrive pas à comprendre, c'est comment get la propriété AutoResizeMask correctement pour que l'en-tête se redimensionne comme les cellules.

Pas une très bonne solution. Mais travaille:

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

J'ai fait face au même problème récemment. L'astuce consistait à utiliser une vue personnalisée en tant que headerView de la table. La superposition layoutSubviews m'a permis de contrôler la layout à volonté. Voici un exemple.

 #import "TableSectionHeader.h" @implementation TableSectionHeader - (id)initWithFrame:(CGRect)frame title:(NSSsortingng *)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:(NSSsortingng *) 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 

J'aimerais avoir une vraie réponse à cela, mais pour l'instant, je viens de retravailler mon UITableView afin que mes "en-têtes" ne soient que des cellules à l'intérieur de la table. Le redimensionnement n'a aucun problème de cette façon.

J'ai créé la sous-class UIView où j'ai utilisé des contraintes visuelles pour coller la sous-vue sur les côtés de l'écran. Et la rotation est très 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: [], mesortingcs: nil, views: views)) NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-15-[view]-15-|", options: [], mesortingcs: 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 }() }