有啥方法可以改变 UIScrollView 的 zoomToRect 的持续时间吗?

Posted

技术标签:

【中文标题】有啥方法可以改变 UIScrollView 的 zoomToRect 的持续时间吗?【英文标题】:Any way of changing the duration of zoomToRect for UIScrollView?有什么方法可以改变 UIScrollView 的 zoomToRect 的持续时间吗? 【发布时间】:2010-07-13 15:11:57 【问题描述】:

有没有办法为[UIScrollView zoomToRect:zoomRect animated:YES]的动画指定时长?

目前它要么是快速的animated:YES,要么是即时的animated:NO

我想指定一个持续时间,例如[UIScrollView setAnimationDuration:2];或类似的东西。

提前致谢!

【问题讨论】:

【参考方案1】:

使用 UIView 的动画。

解释起来有点长,所以我希望这个小例子能让你明白一点。 查看文档以获取更多说明

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

expandedView.frame = prevFrame;

[UIView commitAnimations];

它来自我目前正在从事的一个项目,所以它有点具体,但我希望你能看到基础知识。

【讨论】:

【参考方案2】:

我在 UIScrollView 子类中使用此方法很幸运:

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

这有点作弊,但似乎大部分都有效。有时它确实会失败,但我不知道为什么。在这种情况下,它只是恢复到默认动画速度。

【讨论】:

我遇到了这种“偶尔会失败”的情况,这会导致动画以默认持续时间运行。这种情况似乎发生在先前和目标矩形大小匹配时,即使起源不同。这是我的新动画代码,添加了 scrollRectToVisible 行,我不再遇到这种失败情况。 [UIView animateWithDuration:2 延迟:0 选项:UIViewAnimationOptionBeginFromCurrentState 动画:^ [scrollView scrollRectToVisible:target animated:NO]; [scrollView zoomToRect:目标动画:否]; 完成:无];【参考方案3】:

实际上,这些答案与我最终使用的答案非常接近,但我会单独发布我的答案,因为它不同。如果目标 zoomScale 与当前缩放比例相同,则 zoomToRect 基本上无法正常工作。

您可以尝试使用 scrollToRect,但我没有任何运气。

而只是使用 contentOffset 并将其设置为 zoomRect.origin 并将其嵌套在动画块中。

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

【讨论】:

以上是关于有啥方法可以改变 UIScrollView 的 zoomToRect 的持续时间吗?的主要内容,如果未能解决你的问题,请参考以下文章

xcode 4.5 和 UIScrollview 有啥问题?

Z/OS 中 COBOL 嵌套程序与子程序有啥区别

UIScrollView + 改变方向 = 混乱的子视图(iPad)

Python有啥方法可以改变运行中程序的某个变量而不中断执行?

在HTML中IFrame对象有啥方法和属性,可以改变其中显示的内容,也就是改变地址

UIScrollView 神秘地改变框架和内容大小