这些反弹动画真让我烦恼:
从顶部拖动手指时。
当您以高速向上滚动并抬起手指时。
我尝试过物理,但它并不那么顺利。下面的代码源于经典物理。其中:
力=质量*加速度
加速度=速度/时间
速度=距离/时间
常数是力/质量。
- (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滚动之间的区别: