【问题标题】:How to fix rough scrolling behavior of webView when resizing it?调整大小时如何修复 webView 的粗略滚动行为?
【发布时间】:2023-01-01 17:25:39
【问题描述】:

每个网络浏览器底部都有某种工具栏。

向下滚动时,工具栏消失,页面变高。这在 Safari 和 Chrome 上看起来很流畅。

野生动物园:https://youtu.be/HKFx_zo3818

铬:https://youtu.be/pGNV6hBGkjo

但它在我测试过的所有其他浏览器上看起来都非常粗糙。因为 webView 被调整大小并再次呈现。

勇敢的:https://youtu.be/BYqucsPArIA

它在 Microsoft Edge、Opera、DuckDuckGo、Mozilla Firefox 和 Brave 上看起来很糟糕。

他们的秘密是什么? Safari 和 Chrome 为何如此流畅?

初始化 webView 的代码:

    self.webView = [[WKWebView alloc] init];
    
    self.webView.scrollView.delegate = self;

    self.webView.frame =
    CGRectMake(0.0,
               0.0,
               self.view.frame.size.width,
               self.view.frame.size.height);
    
    [self.view addSubview:self.webView];

    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.apple.com/iphone-14-pro/"]]];

滚动时调整 webView 大小的代码:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    
    // Uses a global previousContentOffset variable.

    if (scrollView.contentOffset.y > 0.0) {
        
        CGFloat movement = scrollView.contentOffset.y - self.previousContetOffset.y;
        
        CGFloat allowableMovement = 10.0;
        
        // Going downwards.
        if (movement >= allowableMovement) {

            [UIView animateWithDuration:0.2
                             animations:^{
                
                self.webView.frame =
                CGRectMake(0.0,
                           0.0,
                           self.view.frame.size.width,
                           self.view.frame.size.height);
            }];
            
            self.previousContetOffset = scrollView.contentOffset;
        }
        
        // Going upwards.
        if (movement <= -allowableMovement) {
            
            [UIView animateWithDuration:0.2
                             animations:^{
                
                self.webView.frame =
                CGRectMake(0.0,
                           0.0,
                           self.view.frame.size.width,
                           self.view.frame.size.height - 80.0); // Height of toolbar
            }];
            
            self.previousContetOffset = scrollView.contentOffset;
        }
    }
}

编辑 1

我愿意使用 Swift。

编辑 2

关于如何做到这一点,我有一个强有力的理论:

当您向下滚动时,触摸不会传递到 scrollView,因此页面实际上不会滚动。相反,它们用于确定工具栏的多少应该是可见的(通过将其位置调整到垂直轴)。当工具栏完全出现时(可能相当于 50px 的滚动)触摸传递到下面的 scrollView 并且页面再次开始滚动。

【问题讨论】:

  • (这看起来是个好问题。一个小问题:赏金是短暂的,通常不应该在问题中提及。值得注意的是,赏金不是为了获得好的答案而支付的,它们主要是为了获得额外的曝光率。虽然人们可能更倾向于在提供赏金的情况下产生一个长答案,无论是否有好的答案都会花费赏金。问题最好没有赏金支付标准的长列表)。

标签: ios swift objective-c uiscrollview wkwebview


【解决方案1】:

Safari 不会调整 WebView 的大小,而是在 WebView 上方显示工具提示。 (如果在不同的网站上尝试,您可以确认这一点)

Brave Browser 在滚动时从两侧(顶部和底部)调整 WebView 的大小,这会使它出现故障和粗糙。

解决方案:

选项1:

不要调整大小,在 WebView 上方显示工具提示。

选项 2:在开始时在 WebView 上方显示工具提示,然后在滚动停止时调整大小,动画流畅(确保在调整大小后保持相同的滚动位置)

选项 2:在滚动停止之前不显示工具提示

【讨论】:

  • 感谢您的回复,但不幸的是它比这复杂得多。有像 maps.google.com 这样的网站,您不能简单地将工具栏放在顶部,因为它隐藏了 UI 元素,但您的回答确实激发了我走向不同路线的灵感。我真的很想听听您对 Google Chrome 是如何做到这一点的看法。我在帖子中添加了一个新视频来演示这一点。现在,我再次查看它,Chrome 似乎也没有调整 webView 的大小。查看右上角的垂直滚动条。你能解释一下这种奇怪的行为吗?
  • 是的,我可以解释一下,我认为 Chrome 在呈现页面时会在网页上添加上边距。你可以通过向 WebView 注入代码来模拟它,但如果网站不是你的,我不推荐这样做。
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 2013-03-07
  • 2016-01-14
  • 2016-04-19
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
相关资源
最近更新 更多