【发布时间】: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