Dónde agregar el código de restricción topLayoutGuide

Solución

Imagine una solución, coloque el siguiente código en el método viewDidLoad de mi controller de navigation subclasificado .m file:

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) { [[self view] setTranslatesAutoresizingMaskIntoConstraints:NO]; id topGuide = [self topLayoutGuide]; UIView * selfView = [self view]; NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings (selfView, topGuide); [[[self view] window] addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide]-0-[selfView]" options:0 metrics:nil views:viewsDictionary] ]; [[[self view] window] layoutSubviews]; // You must call this method here or the system raises an exception } } 

Publicación original

El documento de Apple no dijo claramente que dónde (qué class, qué método) debería colocar este fragment de código (no sé a qué self refiere el self en el código):

 [button setTranslatesAutoresizingMaskIntoConstraints: NO]; id topGuide = myViewController.topLayoutGuide; NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings (button, topGuide); [myViewController.view addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"V: [topGuide]-20-[button]" options: 0 metrics: nil views: viewsDictionary] self.view layoutSubviews; // You must call this method here or the system raises an exception ]; 

Y siento que el trozo de código anterior tiene algún error tipográfico, así que esto es lo que creo que debería ser:

 [button setTranslatesAutoresizingMaskIntoConstraints: NO]; id topGuide = myViewController.topLayoutGuide; NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings (button, topGuide); [myViewController.view addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"V: [topGuide]-20-[button]" options: 0 metrics: nil views: viewsDictionary] ]; self.view.layoutSubviews; // You must call this method here or the system raises an exception 

En ese caso, self puede referirse a un controller de vista. Con este código, su restricción está agregando a su vista, por lo que puede distribuirlos a medida que los configura al llamar a las presentaciones de layoutSubviews . Si agrega este código en el método viewDidLoad (y le recomiendo que lo agregue allí), puede replace las apariciones de myViewController por self