UIWebView在loadRequest时自动调整大小

8
我有一个 UIWebView,里面的内容会被缩放以适应页面。然后,webview 也会调整大小以适应内容(如下图),并能按预期工作。
这个 webview 还附有一个滑动手势用于加载新页面——当在 webview 上执行 loadRequest 加载下一页时,会短暂地闪回到 webview 的初始宽度。使用 NSTimerUILabel 显示 frame 宽度的更改已被确认。
以下是重新调整大小的代码:
string bookHeightS = bookWebview.EvaluateJavascript ("document.getElementsByTagName('body')[0].scrollHeight");
string bookWidthS = bookWebview.EvaluateJavascript ("document.getElementsByTagName('body')[0].offsetWidth");

nfloat bookHeight = 0;
nfloat.TryParse (bookHeightS, out bookHeight);

nfloat bookWidth = 0;
nfloat.TryParse (bookWidthS, out bookWidth);

nfloat scaling = bookWebview.Frame.Height / bookHeight;

nfloat initialWidth = bookWebview.Frame.Width;
nfloat newWidth = scaling * bookWidth;

CGRect frame = new CGRect (bookWebview.Frame.Location, new CGSize (newWidth, bookWebview.Frame.Height));


if (frame.Width != bookWebview.Frame.Width) {
    bookWebview.Frame = frame;
}

这段代码由webview上的LoadFinished委托调用。

我尝试设置webview滚动视图的框架和webview的ContentSize大小。

是什么导致了这种闪烁?

flickering webview


请尝试检查LoadFinished被调用的次数,以确定问题所在。同时,尝试加载其他HTML页面(例如苹果网站)。 - Oleg Shanyuk
2个回答

2

在加载网页时,UIWebView的webViewDidFinishLoad委托将被多次调用,而闪烁的可能原因是您的网页大小不同,并且您正在尝试通过更改UIWebView的框架大小来适应它们(根据您的代码),为什么不固定UIWebView的框架,并让您的网页适应UIWebView?只需在您网页的CSS中使用"width: 100%"即可!


不幸的是,Webview 的内容永远不会是一致的大小,使用“拉伸适应”方法必然会导致部分内容在 Y 轴上被裁剪。我也无法控制 Webview 内部的代码,尽管理论上我可以运行 JS 来添加 CSS。 - Tom Walters
@TomWalters 看起来你需要更好地与内容提供者协调,并应用一些设计原则。 - Allen
如果仅仅是一款电子书阅读器,那就意味着没有标准尺寸。 - Tom Walters

1

在这里调整Web视图框架不太正确。 一旦加载请求 [uiwebview loadRequest:] 成功完成,LoadFinished处理程序确实会触发,但并不意味着您的HTML内容(DOM)的执行已经完成。 以下几点说明可能会有所帮助:

1- 确保在HTML设计中包含一个视口标签以维护填充方面。(在头部)

<meta name="viewport" content="width=device-width, user-scalable=no">

2- 检查UIWebView的内容模式(缩放以适应是默认值),如果需要的话,也可以检查抑制增量渲染(取决于您的设计)

3- 实际上,没有办法捕获Dom元素何时已加载和呈现在HTML中。也许您可以在那里包含一些加载器,并设置超时时间(记得在页面卸载时清除它)

4- 如果您的设计有一些CSS标准,也许您需要考虑将元素的宽度设置为100%以填充页面。

5- 如果您正在使用自动布局,请固定UIWebview的框架,而不是在每次滑动时处理WebViewFrame。

这就是我所能想到的,祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接