【问题标题】: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];或类似的东西。

提前致谢!

【问题讨论】:

    标签: iphone objective-c ios iphone-sdk-3.0


    【解决方案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];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-18
        • 1970-01-01
        • 2011-11-29
        • 1970-01-01
        • 2018-11-12
        • 1970-01-01
        • 2016-03-28
        相关资源
        最近更新 更多