2011-10-10 15 views

risposta

17

Si può mettere questo nel vostro UIScrollView sottoclasse:

- (void)zoomToRect:(CGRect)rect animated:(BOOL)animated 
{ 
    [UIView animateWithDuration:(animated?0.3f:0.0f) 
          delay:0 
         options:UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ 
         [super zoomToRect:rect animated:NO]; 
        } 
        completion:nil]; 
} 
+2

Questo è geniale. – silviupop

0

Come sull'utilizzo:

[UIView beginAnimations:@"" context:nil]; 
[UIView setAnimationDuration:2.0]; //Or any other duration 

[theScroll setContentOffset:offsetPoint]; //offsetPoint is a CGPoint that defines the point you want your scroller to show 

[UIView commitAnimations]; 

Il rovescio della medaglia è che è necessario calcolare l'esatto CGPoint per ottenere il corretto offset da raggiungere.

+0

Ho provato questo aproach, è necessario anche impostare il livello di zoom e l'animazione risultante non è identico a zoomToRect. – silviupop

0

Sono riuscito a implementare zoomToRect utilizzando alcuni CA3DTransforms. Inserirò il codice qui nel caso in cui qualcuno fosse interessato.

Ho dovuto mantenere un riferimento al frame originale di scrollView per farlo funzionare.

rect.origin.x = ((int)rect.origin.x) % (int)self.initialFrame.size.width;  
float scale = MIN(self.initialFrame.size.width/rect.size.width,self.initialFrame.size.height/rect.size.height); 

CGSize scaledFrameSize = CGSizeMake(self.initialFrame.size.width/scale, self.initialFrame.size.height/scale); 

CGPoint middleOfFrame = CGPointMake(self.initialFrame.size.width/2 ,self.initialFrame.size.height/2); 
CGPoint transformPoint = CGPointMake(rect.origin.x + scaledFrameSize.width/2,rect.origin.y + scaledFrameSize.height/2); 
CGPoint offsetToCenter = CGPointMake((scaledFrameSize.width - rect.size.width)/2 * scale,(scaledFrameSize.height - rect.size.height)/ 2 * scale); 

[UIView animateWithDuration:1 animations:^ { 
    self.layer.transform = CATransform3DConcat(CATransform3DConcat(CATransform3DConcat(CATransform3DMakeTranslation(middleOfFrame.x,middleOfFrame.y, 0), 
               CATransform3DMakeTranslation(-transformPoint.x, -transformPoint.y,0)), 
               CATransform3DMakeScale(scale, scale, 1)), 
               CATransform3DMakeTranslation(offsetToCenter.x, offsetToCenter.y, 0)); 
}]; 
Problemi correlati