Mise en page automatique sur UITableViewHeader

J'ai envoyé un rapport de bug avec Apple à propos de ce problème!

J'essaie d'utiliser la nouvelle layout automatique iOS 6 sur mon UITableViewHeader, mais tout ce que je lance à elle revient avec l'erreur à la fin de la post.

Mon code:

TBMTableViewController.h

#import <UIKit/UIKit.h> @interface TBMTableViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> @end 

TBMTableViewController.m

 #import "TBMTableViewController.h" #import "UIView+Constraint.h" @implementation TBMTableViewController - (void)viewDidLoad { [super viewDidLoad]; UITableViewController *tableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain]; [tableViewController.tableView setTranslatesAutoresizingMaskIntoConstraints:NO]; UITableView *tableView = tableViewController.tableView; [tableView setTranslatesAutoresizingMaskIntoConstraints:NO]; [tableView setDelegate:self]; [tableView setDataSource:self]; [self.view addSubview:tableView]; UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 200.0f)]; [headerView setTranslatesAutoresizingMaskIntoConstraints:NO]; [tableView setTableHeaderView:headerView]; UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [btn1 setTranslatesAutoresizingMaskIntoConstraints:NO]; [btn1 setTitle:@"Button 1" forState:UIControlStateNormal]; [btn1 sizeToFit]; [headerView addSubview:btn1]; UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [btn2 setTranslatesAutoresizingMaskIntoConstraints:NO]; [btn2 setTitle:@"Button 2" forState:UIControlStateNormal]; [btn2 sizeToFit]; [headerView addSubview:btn2]; NSDictionary *views = NSDictionaryOfVariableBindings(tableView, headerView, btn1, btn2); [self.view addVisualConstraints:@"H:|[tableView]|" forViews:views]; [self.view addVisualConstraints:@"V:|[tableView]|" forViews:views]; [headerView addVisualConstraints:@"H:[btn1]-|" forViews:views]; [headerView addVisualConstraints:@"V:|-[btn1]" forViews:views]; [headerView addVisualConstraints:@"H:[btn2]-|" forViews:views]; [headerView addVisualConstraints:@"V:[btn1]-[btn2]" forViews:views]; [headerView addVisualConstraints:@"[btn2(==btn1)]" forViews:views]; } @end 

UIView + Constraint.m

 - (void)addVisualConstraints:(NSSsortingng *)constraintSsortingng forViews:(NSDictionary *)views { [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:constraintSsortingng options:0 mesortingcs:0 views:views]]; } 

Erreur:

 2013-02-01 00:43:34.481 ConstraintTest[10217:c07] *** Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2380.17/UIView.m:5776 2013-02-01 00:43:34.483 ConstraintTest[10217:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.' *** First throw call stack: (0x1c94012 0x10d1e7e 0x1c93e78 0xb67665 0x6639f 0x10e56b0 0x2290fc0 0x228533c 0x2290eaf 0x1052bd 0x4db56 0x4c66f 0x4c589 0x4b7e4 0x4b61e 0x4c3d9 0x4f2d2 0xf999c 0x46574 0x4676f 0x46905 0x4f917 0x2b15 0x13157 0x13747 0x1494b 0x25cb5 0x26beb 0x18698 0x1befdf9 0x1befad0 0x1c09bf5 0x1c09962 0x1c3abb6 0x1c39f44 0x1c39e1b 0x1417a 0x15ffc 0x28dd 0x2805) libc++abi.dylib: terminate called throwing an exception (lldb) 

J'ai essayé tout ce que je pouvais penser. Même Google n'a pas été utile pour fournir une réponse. J'ai supprimé le code non pertinent, par exemple les methods UITableViewDataSource- et UITableViewDelegate, à des fins de clarification. Il n'y a pas de plumes impliquées et la seule chose que mon appDelegate fait est init TBMTableViewController et en le définissant comme rootViewController.

Edit: J'ai mis à jour ma méthode viewDidLoad pour clarifier que je veux utiliser des contraintes sur les controls à l'intérieur de UITableViewHeader, pas l'en-tête lui-même. Même erreur 🙂

Cela s'est avéré être une erreur vraiment stupide de ma part. J'ai finalement tout fonctionné quand j'ai enlevé les lignes:

 [tableView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

et

 [headerView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

J'utilisais à la fois viewWillLayoutSubviews et viewDidLayoutSubviews dans le même viewcontroller, après avoir géré avec single viewWillLayoutSubviews , cela a fonctionné pour moi.