如何复制UIScrollView的反弹动画?

时间:2014-07-30 16:17:00

标签: ios objective-c uiscrollview uiviewanimation

这些反弹动画真让我烦恼:

  1. 从顶部拖动手指时。

  2. 当您以高速向上滚动并抬起手指时。

  3. 我尝试过物理,但它并不那么顺利。下面的代码源于经典物理。其中:

    力=质量*加速度

    加速度=速度/时间

    速度=距离/时间

    常数是力/质量。

        - (void)scrollViewDidScroll:(UIScrollView *)scrollView
        {
            CGPoint contentOffset = scrollView.contentOffset;
    
            NSTimeInterval timeInterval = [NSDate timeIntervalSinceReferenceDate];
    
            if (scrollView.contentOffset.y == 0) {
    
                CGFloat constant = 10000.0;
                CGFloat velocity = (contentOffset.y - _lastContentOffset.y) / (timeInterval - _lastTimeInterval) * -1;
                CGFloat time = velocity / constant;
                CGFloat distance = powf(velocity, 2) / constant;
    
                CGFloat minimumDistance = 0;
                CGFloat maximumDistance = (self.frame.size.height - minimumDistance) * (1 - PHI) * PHI;
    
                if (distance > maximumDistance - minimumDistance) {
    
                    distance = maximumDistance - minimumDistance;
                    time = distance / velocity;
                }
    
                NSLog(@"Velocity: %f", velocity);
                NSLog(@"Time: %f", time);
                NSLog(@"Distance: %f", distance);
    
                [UIView animateWithDuration:time
                                  delay:0
                 usingSpringWithDamping:1
                  initialSpringVelocity:1
                                options:UIViewAnimationOptionAllowUserInteraction
                             animations:^{
    
                                     _webView.frame = CGRectMake(0, distance, _webView.frame.size.width, _webView.frame.size.height);
                             }
                             completion:^(BOOL finished){
    
                                     [UIView animateWithDuration:time
                                                       delay:0
                                      usingSpringWithDamping:1
                                       initialSpringVelocity:1
                                                     options:UIViewAnimationOptionAllowUserInteraction
                                                  animations:^{
    
                                                          _webView.frame = CGRectMake(0, 0, _webView.frame.size.width, _webView.frame.size.height);
                                                  }
                                                  completion:nil];
                             }];
            }
    
            _lastContentOffset = contentOffset;
            _lastTimeInterval = timeInterval;
        }
    

    除了创建UIScrollView之外还有其他方法吗?

    编辑:即使关闭了反弹,我也试图让WKWebView反弹。我转身反弹,然后实施我自己的反弹方法。此外,WKWebView有一些奇怪的弹跳行为,因此保留默认的UIScrollView不是一种选择。

    编辑2:以下是2个视频,展示了WKWebView和UIWebView滚动之间的区别:

    1. UIWebView:https://www.youtube.com/watch?v=juyN_B8ba48
    2. WKWebView:https://www.youtube.com/watch?v=sLEH9rnwYVU

0 个答案:

没有答案