5

Sto cercando di aumentare l'altezza della tastiera personalizzata in un'animazione con il seguente codice. Ma non riesco a capire perché il cambiamento si verifica all'istante, ignorando l'animazione.Animazione altezza tastiera personalizzata in iOS 8

//In viewDidAppear 

[self.view needsUpdateConstraints]; 
[UIView animateWithDuration:2 animations:^{ 
    CGFloat _expandedHeight = 500; 
    NSLayoutConstraint *_heightConstraint = [NSLayoutConstraint 
      constraintWithItem: self.view 
      attribute: NSLayoutAttributeHeight 
      relatedBy: NSLayoutRelationEqual 
      toItem: nil 
      attribute: NSLayoutAttributeNotAnAttribute 
      multiplier: 0.0 
      constant: _expandedHeight]; 
    [self.view addConstraint: _heightConstraint]; 
    [self.view layoutIfNeeded]; 
}]; 

risposta

0

aggiungere prima le vincoli all'esterno del blocco animazione, quindi chiedono updateConstraints, e all'interno del blocco animazione, chiamano layoutIfNeeded Speri questo funzionerà

CGFloat _expandedHeight = 500; 
NSLayoutConstraint *_heightConstraint = [NSLayoutConstraint 
     constraintWithItem: self.view 
     attribute: NSLayoutAttributeHeight 
     relatedBy: NSLayoutRelationEqual 
     toItem: nil 
     attribute: NSLayoutAttributeNotAnAttribute 
     multiplier: 0.0 
     constant: _expandedHeight]; 
[self.view addConstraint: _heightConstraint]; 
[self.view needsUpdateConstraints]; 
[UIView animateWithDuration:2 animations:^{ 

[self.view layoutIfNeeded]; 
}]; 
+0

Quando si tenta questa soluzione, la durata non viene ancora presa in considerazione. – Drico

+0

qualcuno ha trovato qualche soluzione? – Renatus

+0

La cosa migliore che ho trovato è usare un CADisplayLink. Questa soluzione funziona ma non è abbastanza stabile. –

0

Il sotto è un codice che uso per animare la posizione X centrale di una linea. Ho collegato il centro X di questa linea con il centro di una vista di riferimento utilizzando un IBOutlet NSLayoutConstraint. Inorder per le animazioni che si verificano con l'esecuzione automatica è necessario aggiornare il vincolo e chiamare il layoutIfNeeded all'interno del blocco di animazione. Questa è sicuramente l'idea di animazione con autolayout.

blueScrollerCenterXConstraint.constant = (btn.tag - 4000)*btn.frame.size.width; 
    [blueScroller updateConstraints]; 

    [UIView animateWithDuration:0.3 animations:^{ 
    [blueScroller layoutIfNeeded]; 
}]; 
0
  1. Non si dovrebbe aggiungere il vincolo lì.

  2. Aggiungilo e disabilitalo (o imposta una priorità davvero molto bassa).

  3. Successivamente, modificare la priorità in 999 e chiamare layoutIfNeded nel blocco di animazione.