5

Se aggiungo qualsiasi tipo di UIDynamicBehavior alle mie viste, si interrompe completamente quando il dispositivo viene ruotato. Ecco di cosa si tratta in verticale (visualizzati correttamente):UIDynamics e Device Rotation

Correct Layout

E qui è nel paesaggio, tutto rotto: Broken layout

Non credo che sia un problema layout automatico, perché se tolgo le chiamate per aggiungere UIDynamicBehavior funziona correttamente senza problemi di caricamento automatico. Neanche gli errori di autolayout vengono mai lanciati. Ecco il codice:

@interface SWViewController() { 
    UICollisionBehavior *coll; 
    UIDynamicAnimator *dynamicAnimator; 
} 

@implementation SWViewController 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    dynamicAnimator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self setupCollisions]; // commenting this out fixes the layout 
} 

- (void)setupCollisions { 
    NSArray *dynamicViews = @[greenView]; 
    coll = [[UICollisionBehavior alloc] initWithItems:dynamicViews];  
    CGFloat topBound = CGRectGetMinY(greenView.frame); 
    [coll addBoundaryWithIdentifier:@"top" 
         fromPoint:CGPointMake(0, h1) 
          toPoint:CGPointMake(CGRectGetWidth(greenView.frame), h1)];  
    [dynamicAnimator addBehavior:coll]; 
} 

Se sovrascrivo didRotateFromInterfaceOrientation posso vedere che il confine superiore del greenView non segue quello autolayout dice che dovrebbe (ancora una volta, eliminando la chiamata a setupCollisions consente la correzione).

I confini layout automatico su greenView sono:

height = 200 
trailing space to Superview = 0 
leading space to Superview = 0 
bottom space to Superview = 0 
+0

Ciao, vedo che si sta utilizzando Collision Comportamento qui. Cosa fa questo senza Gravity Behaviour? Grazie. – Unheilig

+0

In questo esempio, non sto nemmeno usando un Gravity Behavior. Se lo spengo, fa la stessa cosa. – swilliams

+1

Consiglio vivamente di guardare i video del WWDC sull'argomento. Sessioni 206 e 221 di quest'anno. https://developer.apple.com/wwdc/videos/ Crea le tue domande su SO se ne hai. – swilliams

risposta

2

Una soluzione che ho trovato è stato quello di ignorare willRotateToInterfaceOrientation: e rimuovere il UIDynamicItems e poi ri-aggiungere in didRotateFromInterfaceOrientation:. Questo mi sembra piuttosto hacky e potrebbe potenzialmente introdurre bug una volta che aggiungo comportamenti più complessi.

+0

Non lo compro davvero come risposta a questo problema, perché riapplicando il comportamento all'animatore, l'animazione si ripete e per farlo su ogni rotazione ... non elegante. –

+0

Mi piacerebbe vederne uno migliore (per favore)! Perché sì, ho dovuto tenere traccia dello stato delle cose e riapplicare con cura i comportamenti in modo che le animazioni non fossero stutage e ripetere. – swilliams

+0

Hai trovato una soluzione migliore per questo? Soprattutto con iOS8 .. – Jan

0

L'animatore dinamico sta cambiando i frame delle viste coinvolte. Di conseguenza qualsiasi animazione sarebbe stato disturbato da una chiamata a -[UIView setNeedsLayout] (vista sarebbe stato messo a vincolo posizioni guidati a prescindere dallo stato di animazione dinamica.

La mia osservazione è che è di utilizzare i vincoli di layout generate automaticamente l'animatore dinamica li rimuove dal qualsiasi vista coinvolti nell'animazione

Se si aggiungono i propri vincoli di layout -. persistono -. ma possono disturbare l'animazione quando la vista viene chiesto di ricalcolare il layout

0

due volte prego controllare i vincoli di layout auto

.

Ho avuto un sim ilar problema:

Nel mio caso, ho una sottoview, MyView, che aveva una serie di vincoli: V: | - (0) - [MyView], V: [MyView] - (0) - |, H : [MyView: (== 300)], e funziona bene con UIDynamics. Ma dopo aver aggiunto UIDynamics a MyView, la larghezza è cambiata durante la rotazione, che è molto simile al tuo problema.

ho riparato con l'aggiunta di un altro vincolo: H: | - (0) - [MyView]

Problemi correlati