UIScrollView中的动画

时间:2011-04-14 07:16:42

标签: iphone ios animation uiscrollview

我希望淡出视图,因为它在父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) { }];
}

4 个答案:

答案 0 :(得分:13)

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

animateWithDuration:延迟:选择:动画:完整:

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

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

<强> PPPPRRRRFFFFFFFFFFFFFFFFFF

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

<强> PRFPRFPRFPRFPRFPRFPRFPRF

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

答案 1 :(得分:10)

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

[UIView beginAnimations:@"FadeAnimations" context:nil];
[UIView setAnimationDuration:3]; 

self.subview.alpha = 0.0f;

[UIView commitAnimations];

答案 2 :(得分:8)

我建议,因为不透明度是基于用户手指在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
  }
}

答案 3 :(得分:0)

根据仍然不应广泛发布的信息,所有iOS 4.x版本在动画进行过程中完全阻止用户交互。

但是,在动画期间你是否仍然注册了UITouches是不是很有趣?嗯...也许这表明还有一些新东西即将推出尚未发布的版本!

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