2010-07-13 2 views

Antwort

1

Verwenden Sie die Animationen von UIView.

Es ist ein bisschen lang zu erklären, also hoffe ich, dass dieses kleine Beispiel die Dinge ein wenig aufklärt. Blick auf die documantation für weitere Anweisungen

[UIView beginAnimations: nil context: NULL]; 
[UIView setAnimationDuration: 2]; 
[UIView setAnimationDelegate: self]; 
[UIView setAnimationDidStopSelector: @selector(revertToOriginalDidStop:finished:context:)]; 

expandedView.frame = prevFrame; 

[UIView commitAnimations]; 

Es ist aus einem Projekt arbeite ich zur Zeit an, so dass es ein bisschen spezifisch ist, aber ich hoffe, dass Sie die Grundlagen sehen.

0

Ich habe in einer UIScrollView Unterklasse Glück mit dieser Methode hatte:

- (void)zoomToRect:(CGRect)rect duration:(NSTimeInterval)duration 
{ 
    [self setZoomLimitsForSize:rect.size]; 

    if (duration > 0.0f) { 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationBeginsFromCurrentState:YES]; 
     [UIView setAnimationDuration:duration]; 
    } 
    [self zoomToRect:rect animated:NO]; 
    if (duration > 0.0f) 
     [UIView commitAnimations]; 

    [self zoomToRect:rect animated:(duration > 0.0f)]; 
} 

Es irgendwie betrügt, aber es scheint meistens zu arbeiten. Gelegentlich scheitert es, aber ich weiß nicht warum. In diesem Fall wird nur die Standardanimationsgeschwindigkeit wiederhergestellt.

+2

Ich schlug diesen 'gelegentlich schlägt fehl' Fall, der die Animation verursacht, um eine Standarddauer zu laufen. Diese Fälle scheinen zu vorkommen, wenn die vorherigen und die Ziel-Rect-Größen übereinstimmen, selbst wenn die Ursprünge unterschiedlich sind. Hier ist mein neuer Animationscode, der die scrollRectToVisible-Zeile hinzufügt, und ich treffe diesen Fehlerfall nicht mehr. [UIView animateWithDuration: 2 Verzögerung: 0 Optionen: UIViewAnimationOptionBeginFromCurrentState Animationen:^{ [scrollView scrollRectToVisible: Ziel animiert: NO]; [scrollView zoomToRect: Ziel animiert: NEIN]; } Vervollständigung: Null]; – fionbio

+0

hay its Great nous !!! Es funktioniert gut Danke –

0

Eigentlich sind diese Antworten wirklich nah an dem, was ich am Ende benutzt habe, aber ich werde meine separat veröffentlichen, da es anders ist. Grundsätzlich funktioniert der ZoomToRect nicht korrekt, wenn der ZielzoomScale derselbe ist wie der aktuelle.

Sie könnten versuchen, scrollenToRect, aber ich hatte kein Glück damit.

Verwenden Sie stattdessen einfach contentOffset und setzen Sie es auf die zoomRect.origin und verschachteln Sie diese im Animationsblock.

[UIView animateWithDuration:duration 
         delay:0.f 
        options:UIViewAnimationOptionCurveEaseInOut 
       animations:^{ 
    if (sameZoomScale) { 
     CGFloat offsetX = zoomRect.origin.x * fitScale; 
     CGFloat offsetY = zoomRect.origin.y * fitScale; 

     [self.imageScrollView setContentOffset:CGPointMake(offsetX, offsetY)]; 
    } 
    else { 
     [self.imageScrollView zoomToRect:zoomRect 
           animated:NO]; 
    } 
       } 
       completion:nil];