2015-11-08 43 views
6

Sto utilizzando storyboard e autolayout e imposto i vincoli in IB come IBOutlet nel controller di visualizzazione corrispondente. Sto leggendo diversi posti per quanto riguarda come aggiornare i vincoli di essere diversi nel ritratto e nel paesaggio, ma non sono ancora sicuro di come dovrei fare questo:Modo corretto per aggiornare i vincoli quando l'orientamento del dispositivo cambia?

  1. Devo impostare i nuovi vincoli in -viewWillTransitionToSize:withTransitionCoordinator: metodo, o nel metodo updateViewConstraints?
  2. Quando i nuovi vincoli sono impostati, dovrei chiamare [self.view setNeedsUpdateConstraints]; o layoutIfNeeded o setNeedsLayout?
  3. Come devo aggiornare, ad esempio, la costante di un certo vincolo:

    self.myConstraint.constant = 30.0

o fare:

[self.view removeConstraint:self.passwordViewHeight]; 

self.passwordViewHeight = [NSLayoutConstraint constraintWithItem:self.passwordView 
                 attribute:NSLayoutAttributeHeight 
                 relatedBy:NSLayoutRelationEqual 
                 toItem:nil 
                 attribute:NSLayoutAttributeNotAnAttribute 
                multiplier:1.0 
                 constant:34.0]; 

[self.view addConstraint:self.passwordViewHeight]; 

Grazie in anticipo

risposta

0

La migliore il modo sarebbe cambiare la costante invece di rimuovere il vincolo e ricreare di nuovo. Anche aggiungere o sottrarre dalla costante è molto più veloce nel lungo periodo. Quello che si vorrebbe fare è qualcosa di simile:

[self.view layoutIfNeeded]; 
self.myConstraint.constant = 30.0; 
[self.view layoutIfNeeded]; 

Si consiglia di chiamare layoutIfNeeded prima e dopo aver modificato la costante pure. Questo perché potresti avere qualche vincolo che non è stato ancora fatto e lo farai prima di cambiare più vincoli.

+0

Grazie. Da quale metodo dovrei chiamarlo? – AppsDev

+0

È possibile effettuare il proprio metodo per chiamarlo da, se è stata impostata una notifica per il cambiamento di orientamento del dispositivo chiamarlo da tale metodo. Se non lo hai già impostato, vorresti farlo con il seguente codice: '[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (yourMethodHere) nome: UIDeviceOrientationDidChangeNotification oggetto: nil];' – Tyler

+0

Sarebbe ' metodo viewWillTransitionToSize' anche un buon posto? – AppsDev

0

L'idea migliore sarà utilizzare Size Classes in Interface Builder per ottenere il cambio di autorotazione.

https://www.codefellows.org/blog/size-classes-with-xcode-6-one-storyboard-for-all-sizes

+0

Grazie. Devo supportare iOS 7 e versioni successive per dispositivi iPhone e ho già uno 'storyboard' con solo' autolayout' abilitato. Ho circa 32 scene in questo storyboard ... Vale la pena di passare alle classi di dimensioni a questo punto e tenendo conto che devo supportare iOS 7? – AppsDev

1

modifica Orientamento essere rilevato utilizzando il metodo viewWillTransitionToSize. Questo metodo verrà chiamato quando l'orientamento del dispositivo sta per cambiare.

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator (id<UIViewControllerTransitionCoordinator>)coordinator{ 
     //change constraints 
} 

In alternativa, se si desidera modificare i vincoli dopo i cambiamenti di orientamento, utilizzare il metodo animateAlongsideTransition dell'oggetto coordinatore nel metodo viewWillTransitionToSize.

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{ 
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) { 
     //change constraints 
    }]; 
}