2013-03-17 4 views
7

Ich versuche, eine Animation in meiner iOS-App zu erstellen, wo eine neue Ansicht auf dem Bildschirm von links verschoben wird, während die Hauptansicht nach rechts verschoben wird. Die Hauptansicht ist eine Unteransicht der Draufsicht meines Ansichtscontrollers und die einschiebbare Seitenansicht wird aus einer separaten XIB-Datei geladen.Versuchen, zwei UIViews gleichzeitig zu animieren, bewegt sich nur

Falls relevant es ist, hier ist mein Code die Seitenansicht für das Laden von meinem Haupt-View-Controller-Methode viewDidLoad genannt:

sideViewController = [[SideViewController alloc] init]; 
[sideViewController loadView]; 

sideView = sideViewController.topView; 
[self.view addSubview:sideView]; 
sideView.hidden = YES; 
sideView.frame = CGRectMake(-200, 0, 200, 460); 

Und hier ist der Code, der die beiden Ansichten zu animieren aufgerufen wird:

sideView.hidden = NO; 
[UIView animateWithDuration:0.25f 
       animations:^{       
        mainView.frame = CGRectMake(200, 0, 320, 460); 
        sideView.frame = CGRectMake(0, 0, 200, 460); 
       }]; 

Das scheint einfach genug. Aber aus irgendeinem Grund animiert nur SideView - mainView bewegt sich nirgendwohin. Und um die Dinge noch verwirrender zu machen, wenn ich die Zeile in dem Animationsblock auszeichne, der sideView bewegt, beginnt die Animation für mainView zu arbeiten.

Weiß jemand, was los ist? Von all den Suchen und Dokumenten, die ich gelesen habe, sollte das, was ich mache, gut funktionieren. Was ich für eine einfache Animation hielt, hat sich in frustrierende Stunden verwandelt. Jede Hilfe würde sehr geschätzt werden!

Edit:

aus der Anregung des Guo Luchuan Gehen habe ich versucht, verschiedene Eigenschaften der beiden UIViews Animieren. Die meisten haben das gleiche Ergebnis, obwohl beide Transformationseigenschaften animiert wurden fast funktioniert. In diesem Fall wurden beide UIViews animiert, aber das mainView hat nur das falsche getan: seine Animation begann damit an einer anderen Position und endete an der falschen Stelle. Es sieht aus wie es die Übersetzung durchführen ich es zu tun angewiesen, aber an dieser Stelle in Vektorberechnungen ausgedrückt beginnen:

starting_point - 0.5 * total_translation 

was bedeutet, es endet um:

starting_point + 0.5 * total_translation 

Die Seitenansicht jedoch richtig beseelt.

Das ist verdammt nervig. Mir war nicht klar, dass die Animationen auf iOS auf diese Weise so kaputt waren. Das nächste, was ich versuchen werde, ist CABasicAnimation, obwohl ich unglücklich bin, muss ich versuchen, solch eine Low-Level-API für etwas so einfaches zu versuchen.

Antwort

3

Das Problem war, dass ich Autoresize für meine Xib-Dateien aktiviert hatte. Sobald ich es ausgeschaltet habe, funktionierte mein ursprünglicher Animationscode einwandfrei.

+0

Ich hatte das gleiche Problem und hatte auch AutoLayout eingeschaltet. Das Ausschalten hat mir leider nicht geholfen .... obwohl ich den Ort, an dem du ihn global abschaltest, vielleicht verpasst habe (ich baue meine Bildschirme mit Code). Eine Lösung, die ich gefunden habe, war, beide Ansichten in eine übergeordnete Containeransicht einzubetten und sie einfach zu animieren. – avance

4

Ich habe ein sehr ähnliches Problem wie Sie getroffen.

Wenn ich 2 Ansichten gleiche Eigenschaft (wie frame oder transform) zur gleichen Zeit, in der UIView animation block, wird es nicht funktionieren, was ich erwarte.

Also setze ich eine Ansichten frame und setzen Sie eine andere Ansichten transform, dann funktioniert es gut, aber ich weiß nicht, warum es so sein wird.

Ich denke, es wird gut für Sie funktionieren.

sideView.hidden = NO; 
[UIView animateWithDuration:0.25f 
       animations:^{       
        mainView.frame = CGRectMake(200, 0, 320, 460); 
        sideView.transform = CGAffineTransformMakeTranslation(200,0); 
       }]; 

Und ich denke, Sie CABasicAnimation 2 machen und sie dann in den CAAnimationGroup hinzuzufügen.Es kann auch für Sie

+0

Das ist ein großartiger Vorschlag, obwohl ich es versucht habe und es hat nicht funktioniert. Ich habe tatsächlich versucht, mehrere verschiedene Kombinationen von Attributen zu animieren und entweder das gleiche Ergebnis oder ein anderes falsches Ergebnis zu erhalten. Ich werde meinen Hauptbeitrag bearbeiten, um näher darauf eingehen zu können. – GuyGizmo

0

arbeiten Wenn die sideView ein subview von mainView ist, verwenden Sie diese Animation Methode:

+animateWithDuration:delay:options:animations:completion: 

mit Option:

UIViewAnimationOptionAllowAnimatedContent 
+0

sideView und mainView sind Geschwister unterhalb der Ansicht meines View-Controllers, dies sollte nicht gelten. Die seltsame Sache ist jedoch, dass sideView mainView auf eine seltsame Weise, die ich nicht verstehe, eindeutig beeinflusst, also habe ich diese Option trotzdem versucht, aber es hat keinen Unterschied gemacht. – GuyGizmo

+0

Entschuldigung, ich lese dein Q falsch. Wenn sie Geschwister sind, weiß ich nicht, was mit dir passiert. – Tricertops

0

ich endlich eine Lösung gefunden, und Ich denke, es ist ziemlich abscheulich. Hier ist der Code, das funktioniert:

mainView.transform = CGAffineTransformMakeTranslation(400,0); 
CABasicAnimation *move = [CABasicAnimation animationWithKeyPath:@"transform.translation.x" ]; 
[move setFromValue:[NSNumber numberWithFloat:200]]; 
[move setToValue:[NSNumber numberWithFloat:400]]; 
[move setDuration:0.25]; 
move.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
[[mainView layer] addAnimation:move forKey:@"transform.translation.x"]; 

sideView.center = CGPointMake(100, 230); 
CABasicAnimation *sideMove = [CABasicAnimation animationWithKeyPath:@"transform.translation.x" ]; 
[sideMove setFromValue:[NSNumber numberWithFloat:-200]]; 
[sideMove setToValue:[NSNumber numberWithFloat:0]]; 
[sideMove setDuration:0.25]; 
sideMove.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
[[sideView layer] addAnimation:sideMove forKey:@"transform.translation.x"]; 

Erstens, wenn ich nicht gesetzt habe verwandelt die Hauptansicht der, diese ganze Sache nicht funktionieren würde und das Mainview würde nirgendwo bewegen, nachdem die Animation gemacht wurde. Ich habe versucht, seinen Rahmen und seine Mitte einzustellen, aber beide hatten keine Wirkung. Nur transformiert funktioniert. Dieses Detail ähnelt der Verwendung der animateWithDuration-Methode.

Zweitens, und das ist der Teil, der mich am meisten verwirrt hat, warum sind die Zahlen, was sie sind? Aus irgendeinem Grund musste ich die Hauptansicht um 200 zusätzliche Pixel nach rechts versetzen (die Breite von sideView), um sie richtig auszurichten. Wenn ich das nicht tun würde, würde es genau dorthin animieren, wo es früher war, obwohl ich seine affine Transformation von der Identität zu einer 200 Pixel großen Übersetzung nach rechts änderte.

So nahe, wie ich sagen kann, ist Seitenspiegel Mainview auf eine seltsame Art und Weise zu beeinflussen, obwohl sie Geschwister sind direkt unter meiner Sicht Top-Level-Ansicht des Controllers, und sollte nicht jede Art von hierarchischen Beziehung. Meine Vermutung ist, dass dies etwas mit dem Laden der SideView von einer Xib zu tun hat, aber soweit ich das beurteilen kann, mache ich das richtig.

Hoffentlich wird diese Lösung für jemand anderen nützlich sein, der sich in einer ähnlichen Situation befindet, und sie müssen nicht die gleiche lästige tote Hühnchen-Programmierung machen, die ich gerade gemacht habe.

Auch wenn jemand eine Erklärung für all dies bieten kann, wäre ich sehr dankbar! Ich mag es nicht, Dinge zu programmieren, die ich nicht verstehe, und ich würde gerne erfahren, warum all das passiert ist, damit ich solche Situationen in Zukunft vermeiden kann.

+1

Das wirkliche Q ist, ** warum ** es nicht auf die einfache Art funktionierte? Wenn du mir noch mehr erzählen kannst: Woher rufst du die Animation? Verwenden Sie Autoresizing oder Auto Layout in Code und XIB? – Tricertops

+2

Oh mein Gott, das ganze Problem war, dass ich Auto-Layout aktiviert hatte. Das ist nicht das erste Mal, dass ich diesen Fehler gemacht habe, aber ich habe es vergessen, bis du es erwähnt hast. Ich habe es einfach auf beiden XIB-Dateien ausgeschaltet und auf einmal funktioniert AnimedWithDuration perfekt. Stunden meiner Zeit waren nur wegen dieser Eigenschaft verloren, und es gab keinen Hinweis, dass es der Schuldige war. – GuyGizmo

+0

Ja, wenn Sie Auto Layout verwenden, ändern Sie die Bilder nicht direkt. Ich habe keine Animationen unter Auto Layout versucht, aber vielleicht können Sie Konstanten von Constraints animieren. – Tricertops