UIScrollView中的动画

Ope*_*X03 8 iphone animation uiscrollview ios

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

小智 13

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

animateWithDuration:延迟:选项:动画:完成:

将"UIViewAnimationOptionAllowUserInteraction"添加到选项以允许滚动时进行交互.

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

PPPPRRRRFFFFFFFFFFFFFFFFFF

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

PRFPRFPRFPRFPRFPRFPRFPRF

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


Mos*_*szi 10

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

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

self.subview.alpha = 0.0f;

[UIView commitAnimations];
Run Code Online (Sandbox Code Playgroud)

  • 也许尝试更彻底的块动画方法animate:delay:options:completion:并在选项UIViewAnimationAllowUserInteraction中发送 (2认同)

Jac*_*cob 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
  }
}
Run Code Online (Sandbox Code Playgroud)