2011-10-10 6 views

Respuesta

17

Usted puede poner esto en su UIScrollView subclase:

- (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

Esto es brillante. – silviupop

0

Cómo sobre el uso:

[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]; 

La desventaja es que es necesario calcular la CGPoint exacta para lograr el correcto desplazamiento que desea llegar.

+0

probé este abordaje, también debe establecer el nivel de zoom y la animación resultante no es idéntica a zoomToRect. – silviupop

0

Logré implementar zoomToRect usando algunas CA3DTransforms. Pegaré el código aquí en caso de que alguien esté interesado.

Tuve que mantener la referencia al marco original de scrollView para que esto funcione.

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)); 
}]; 
Cuestiones relacionadas