Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带持续时间的iOS zoomToRect_Ios_Scrollview - Fatal编程技术网

带持续时间的iOS zoomToRect

带持续时间的iOS zoomToRect,ios,scrollview,Ios,Scrollview,可能重复: 是否有任何方法可以复制[UIScrollView zoomToRect:zoomRect animated:YES]的行为,从而使动画持续给定的时间?如何使用: [UIView beginAnimations:@"" context:nil]; [UIView setAnimationDuration:2.0]; //Or any other duration [theScroll setContentOffset:offsetPoint]; //offsetPoint is a

可能重复:

是否有任何方法可以复制[UIScrollView zoomToRect:zoomRect animated:YES]的行为,从而使动画持续给定的时间?

如何使用:

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

缺点是您需要计算精确的CGPoint以获得您想要达到的正确偏移量。

我使用一些CA3DTransforms实现了zoomToRect。如果有人感兴趣,我会把代码贴在这里

我必须保留对scrollView原始框架的引用,这样才能工作

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

您可以将其放入
UIScrollView
子类中:

- (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];
}

我尝试了这一方法,您还必须设置缩放级别,并且生成的动画与zoomToRect不同。