3 Stimmen

UIView-Animation setzt Ansichten auf ursprüngliches Rechteck zurück

Ich versuche, ein UIWebView von rechts auf den Bildschirm zu animieren, wenn ein Link angetippt wird. Dafür benutze ich zwei UIViews. Eines namens onScreenWebView und ein anderes namens offScreenWebView. Die Idee ist, dass ich das offscreenWebView von rechts auf den Bildschirm animieren und das onScreenWebView nach links vom Bildschirm animieren kann. Dann tausche ich die Ansichten aus (damit die Ansicht auf dem Bildschirm das onScreenWebView wird und umgekehrt), aber meine Animation hat Probleme. Ich muss beachten, dass es beim ERSTEN MAL großartig funktioniert. Danach funktioniert es überhaupt nicht gut.

Die Ansichten sind wie folgt ausgerichtet

      __________ __________
      |        | |        |
      |   on   | |  off   |
      | screen | | screen |
      |________| |________|

Hier ist der Animationscode :

offScreenWebView.hidden = true;

offScreenWebView.frame = self.frame;
[offScreenWebView offSetX:self.bounds.size.width + kOffsetPadding];         // bewege offscreen nach rechts
[self logWebRects:"begin"];
offScreenWebView.hidden = false;
[self bringSubviewToFront:offScreenWebView];

[UIView animateWithDuration:0.5f delay:0.0f options:UIViewAnimationCurveEaseInOut animations:^{
    [self logWebRects:"during 1"];
    offScreenWebView.frame = self.frame;
    onScreenWebView.frame = CGRectMake(-(self.bounds.size.width + kOffsetPadding), 0, onScreenWebView.bounds.size.width, onScreenWebView.bounds.size.height);
    [self logWebRects:"during 2"];
}completion:^(BOOL finished) {
    [self logWebRects:"finished b4 swap"];
    [self swapWebViews];
    [self logWebRects:"finished -- done"];
}];

Hier ist die Ausgabe meiner logWebRects-Methode (nur der Ursprung jeder Ansicht)

Navigate Typ :: Link angeklickt
Rahmen von self frame :: {{0, 0}, {320, 460}} 

99 -- Punkt des Ursprungs offscreen begin :: {335, 0}
0 -- Punkt des Ursprungs onscreen begin :: {0, 0}
99 -- Punkt des Ursprungs offscreen während 1 :: {335, 0}
0 -- Punkt des Ursprungs onscreen während 1 :: {0, 0}
99 -- Punkt des Ursprungs offscreen während 2 :: {0, 0}
0 -- Punkt des Ursprungs onscreen während 2 :: {-335, 0}
Navigationsart :: Anderes
99 -- Punkt des Ursprungs offscreen finished b4 swap :: {0, 0}
0 -- Punkt des Ursprungs onscreen finished b4 swap :: {-335, 0}
0 -- Punkt des Ursprungs offscreen finished -- done :: {-335, 0}
99 -- Punkt des Ursprungs onscreen finished -- done :: {0, 0}

Navigationstyp :: Link angeklickt
Rahmen von self frame :: {{0, 0}, {320, 460}} 

0 -- Punkt des Ursprungs offscreen begin :: {335, 0}
99 -- Punkt des Ursprungs onscreen begin :: {0, 0}
0 -- Punkt des Ursprungs offscreen während 1 :: {335, 0}
99 -- Punkt des Ursprungs onscreen während 1 :: {0, 0}
0 -- Punkt des Ursprungs offscreen während 2 :: {0, 0}
99 -- Punkt des Ursprungs onscreen während 2 :: {-335, 0}
Navigationstyp :: Anderes
0 -- Punkt des Ursprungs offscreen finished b4 swap :: {335, 0}
99 -- Punkt des Ursprungs onscreen finished b4 swap :: {0, 0}
99 -- Punkt des Ursprungs offscreen finished -- done :: {0, 0}
0 -- Punkt des Ursprungs onscreen finished -- done :: {335, 0}

Diese Logs stammen vom ersten Durchlauf. Dann auch vom zweiten Durchlauf. Sie werden feststellen, dass aus irgendeinem Grund der Animationsblock den Rahmen jeder Webansicht kurz vor dem Abschlussblock zurücksetzt.

Ich sollte erwähnen, dass ich die Webansichten mit einem klassischen Temporärvariablentausch tausche. Außerdem handelt es sich um gleichrangige Ansichten.

3voto

Alessandro Orrù Punkte 3418

Ich weiß, dass das ein bisschen alt ist, aber ich hatte das gleiche Problem und das ist der einzige Thread, den ich dazu gefunden habe.

Das Problem ist, dass bringSubviewToFront eine implizite Animation ausführt (denke ich), die verhindert, dass der Animationsblock den richtigen Rahmen festlegt.

Ich habe es gelöst, indem ich die implizite Animation deaktiviert habe. Versuche es mit diesem Code-Schnipsel anstelle von einfachem bringSubviewToFront.

[CATransaction begin];
[CATransaction setDisabledActions:YES];
[self bringSubviewToFront:offScreenWebView];
[CATransaction commit];

1voto

jrturton Punkte 115612

Ich habe ein ähnliches Setup wie Sie in einer meiner Apps. Leider kann ich nichts signifikant Falsches an Ihrer Implementierung erkennen (obwohl wir Ihre Austausch- und Logging-Methoden nicht sehen können). Meine ruft nicht nach anderen Methoden auf oder arbeitet nicht so intensiv mit Frames. Ich hatte ein Problem mit einem temporären Variablentausch, also bin ich wieder dazu übergegangen, den nächsten Ansichtscontroller als Parameter für die Methode zu verwenden, was viel besser funktionierte.

centreOffRight und centreOffLeft sind CGPoints, die das Zentrum des Bildschirms jeweils nach rechts und links versetzt definieren. next und previous sind die Ansichtscontroller für jede Ansicht. Diese Methode wird von einem Container-View-Controller aufgerufen.

-(void)moveNext:(PlayerViewController*)sender
{
    // Diese muss von rechts geschoben werden
    next.view.center = centreOffRight; 
    [self.view bringSubviewToFront:next.view];
    [UIView animateWithDuration:0.3 
                     animations:^{
                         next.view.center = centreOfScreen;
                         current.view.center = centreOffLeft;} 
                     completion:^(BOOL finished){ 
                         [current wasMovedOffScreen];
                         current = next;
                         next = sender;
                         currentDouble = nextIndex;}];

}

Ich bin zurückhaltend, dies als Antwort zu posten, da ich nicht sehe, warum dies funktionieren sollte, wenn Ihr Code nicht funktioniert, aber hoffentlich hilft es Ihnen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X