【问题标题】:Animation inside a UIScrollViewUIScrollView 内的动画
【发布时间】:2011-04-14 07:16:41
【问题描述】:

当视图在父 UIScrollview 内滚动时,我想淡出视图。当淡出动画开始时,滚动视图停止滚动。当淡入淡出完成时,它会跳到正确的位置。

我的淡出是通过 animateWithDuration 和块对象实现的,在我在 scrollViewWillBeginDragging 中检测到的页面更改时触发。

有谁知道如何让它们同时发生?为了清楚起见,我不是在“动画化” UIScrollView 滚动 - 而是通过用户滑动的交互发生的。

编辑:

这是我用来淡化 UIView 的代码。此代码位于 UIViewController 派生类中,它是 UIScrollView 的委托。当用户开始拖动手指时,我想淡出 subView。但是当用户开始拖动手指时,子视图会消失并且滚动停止。在 subView 完全淡出后,滚动视图将捕捉到用户手指所在的位置。

-(void)scrollViewWillBeginDragging:(UIScrollView*)scrollView
{
    [UIView animateWithDuration:0.5
        animations:^
        {
            self.subView.alpha = 0.0f;
        }
        completion:^(BOOL finished) { }];
}

【问题讨论】:

    标签: iphone ios animation uiscrollview


    【解决方案1】:

    有点晚了,但如果你想继续使用积木,你可以使用:

    animateWithDuration:delay:options:animation:complete:

    在选项中添加“UIViewAnimationOptionAllowUserInteraction”以允许在滚动时进行交互。

    我相信您仍然会遇到滞后问题。这是我能解释它的最好方法。请提前原谅我,因为我可能使用了错误的术语。所有动画都必须在主线程上运行。当您调用动画时,iOS 首先 *P*rocesses 然后 *R*enders 然后生成 *F*rames。看起来像这样。

    PPPPRRRFFFFFFFFFFFFFFFFFF

    但由于 ScrollViews 不知道您的动画将持续多长时间或何时结束,它必须像这样执行动画。

    PRFPRFPRFPRFPRFPRFPRFPRF

    我的理论是,您遇到的延迟与这两个调用同时在主线程上发生冲突有关。除了使用更快的芯片之外,我不确定您将如何解决这个问题。我知道你可以将一个动画推送到 CPU 和一个 GPU,但我在编程方面还没有那么先进。

    【讨论】:

      【解决方案2】:

      非常有趣......我已经检查过了,是的,我有同样的效果......好吧,似乎 animateWithDuration 以某种方式阻塞了主线程......这不合逻辑,并且文档没有也不要说什么.. 但是有一个简单的解决方法,类似于以下内容:(我已将动画持续时间设置为 3,因此我可以在移动滚动视图时看到它正在工作:) ...)

      [UIView beginAnimations:@"FadeAnimations" context:nil];
      [UIView setAnimationDuration:3]; 
      
      self.subview.alpha = 0.0f;
      
      [UIView commitAnimations];
      

      【讨论】:

      • 所以你是说普通的 UIView 方法不影响表格,而块方法呢?很奇怪。
      • 好吧..我不知道为什么(还),但我已经测试过了,我可以确认它是这样工作的......
      • 也许可以尝试更彻底的块动画方法 animate:delay:options:completion: 并发送选项 UIViewAnimationAllowUserInteraction
      • 使用非基于块的 UIView 动画也为我解决了相反的问题(滚动视图导致基于块的 UIView 动画在奇怪的时间触发/根本不触发)。 (iOS 6.1)
      【解决方案3】:

      我建议,因为不透明度是基于用户在 UIScrollView 中的手指移动,使用委托方法 scrollViewDidScroll:。作为参数传递的 scrollView 可用于检查 contentOffset,它只是一个 CGPoint,指示用户滚动到 UIScrollView 的内容视图多远。类似这样的东西可用于将滚动位置与分页 UIScrollView 中给定视图的不透明度相关联:

      - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
        // The case where I used this, the x-coordinate was relevant. You may be concerned with the y-coordinate--I'm not sure
        CGFloat percent = ((int)(scrollView.contentOffset.x) % (int)(scrollView.frame.size.width)) / scrollView.frame.size.width;
        if (percent > 0.0 && percent < 1.0) { // Of course, you can specify your own range of alpha values
          relevantView.alpha = percent; // You could also create a mathematical function that maps contentOffset to opacity in a different way than this
        }
      }
      

      【讨论】:

      • 雅各布,你是国王!
      • 完美的 logicak 解决方案,我转换为垂直分数感谢 mate
      【解决方案4】:

      根据尚未广泛发布的信息,所有 iOS 4.x 版本在动画进行时完全阻止用户交互。

      不过,你的 UITouch 显然还在动画期间注册,这不是很有趣吗?嗯...也许这暗示了一些新的东西即将在一个尚未发布的版本中出现!

      即,如果可以,请阅读有关 UIView 类方法的 iOS 5 Beta 文档。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-08
        • 1970-01-01
        相关资源
        最近更新 更多