5

Wenn ich meinen Ansichten irgendeine Art von UIDynamicBehavior hinzufüge, bricht es Dinge völlig, wenn das Gerät gedreht wird. Hier ist, was es im Portrait ist (korrekt angezeigt):UIDynamics and Device Rotation

Correct Layout

Und hier ist es in der Landschaft, die alle brachen: Broken layout

Ich glaube nicht, es ist ein automatisches Layout Problem, denn wenn ich die Anrufe entfernen Hinzufügen der UIDynamicBehavior es funktioniert gut ohne Probleme mit dem automatischen Layout. Es werden auch keine automatischen Layoutfehler ausgegeben. Hier ist der Code:

@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]; 
} 

Wenn ich didRotateFromInterfaceOrientation außer Kraft setzen kann ich sehen, dass die obere Grenze der greenView folgt nicht, was automatisches Layout sagt, es soll (wieder zu entfernen, den Anruf zu setupCollisions behebt diese).

Die automatische Layout Grenzen auf greenView sind:

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

Hallo, ich sehe, dass Sie hier Kollisionsverhalten verwenden. Was macht das ohne Schwerkraftverhalten? Vielen Dank. – Unheilig

+0

In diesem Beispiel verwende ich nicht einmal ein Schwerkraftverhalten. Wenn ich es ausschalte, macht es das Gleiche. – swilliams

+1

Ich würde sehr empfehlen, die WWDC Videos zu diesem Thema zu beobachten. Sitzungen 206 und 221 von diesem Jahr. https://developer.apple.com/wwdc/videos/ Erstellen Sie Ihre eigenen Fragen zu SO, wenn Sie sie haben. – swilliams

Antwort

2

Eine Lösung war ich gefunden willRotateToInterfaceOrientation: außer Kraft zu setzen und die UIDynamicItems und dann erneut fügen Sie sie in didRotateFromInterfaceOrientation: entfernen. Dies erscheint mir ziemlich hacky und könnte möglicherweise Bugs einführen, sobald ich komplexere Verhaltensweisen hinzufüge.

+0

Ich kaufe das nicht wirklich als eine Antwort für dieses Problem, weil die Animation sich wiederholt, indem sie das Verhalten auf den Animator anwendet, und das bei jeder Drehung zu tun ... nicht elegant. –

+0

Ich würde gerne einen besseren sehen (bitte)! Weil ja, ich musste den Zustand der Dinge verfolgen und Verhaltensweisen sorgfältig wieder anwenden, so dass die Animationen nicht stottern und wiederholen würden. – swilliams

+0

Haben Sie eine bessere Lösung dafür gefunden? Vor allem mit iOS8 .. – Jan

0

Der dynamische Animator ändert Frames der beteiligten Ansichten. Als Ergebnis würde jede Animation durch einen Aufruf von -[UIView setNeedsLayout] gestört werden (Ansichten würden unabhängig vom dynamischen Animationszustand in constraint-getriebene Positionen gesetzt.

Meine Beobachtung ist, dass Sie automatisch generierte Layoutbeschränkungen verwenden, aus denen der dynamische Animator sie entfernt jeder in der Animation beteiligt Ansicht

Wenn Sie eine eigene Layoutbeschränkungen hinzufügen -. sie bestehen -. aber kann die Animation stören, wenn Ansicht Layout neu zu berechnen gefragt wird

0

Sie bitte Ihr auto Layoutbeschränkungen überprüfen

.

Ich hatte eine sehr sim Ähnliches Problem:

In meinem Fall habe ich eine Unteransicht, MyView, die eine Reihe von Einschränkungen hatte: V: | - (0) - [MyView], V: [MyView] - (0) - |, H : [MyView: (== 300)], und es funktioniert gut mit UIDynamics. Aber nach dem Hinzufügen von UIDynamics zu MyView hat sich die Breite während der Rotation geändert, was Ihrem Problem sehr ähnlich ist.

ich es fest durch eine weitere Einschränkung hinzu: H: | - (0) - [MyView]