How to resize webview contents including images to fit bounds horizontally
@mistahenry's comment worked for me:
relative width, ie width: 100%
. You just have to also set <meta name="viewport" content="width=device-width, initial-scale=1">
in your html. If your webview is 100% the width of the screen, this should work just fine. Essentially, you need to be constraining the image in CSS to be relative to the outside container
WKWebView viewport shrink-to-fit not working on iOS 9.3
I filed a bug report with Apple, and this is the response:
"No, we don’t want to maintain shrink-to-fit behavior. The workaround is to use a viewport meta tag that correctly describes the width of the content."
I tried this out. If, in the viewport tag, you specify a width of the actual width of the html after it's rendered, it will display properly on your device width. In my example above, with a table width of 700, if you specify: <meta name=\"viewport\" content=\"width=700, shrink-to-fit=YES\">
Then the page will display without horizontal scrollbars.
Note that you can't specify an initial-scale viewport property, though. Then it doesn't display with the proper width.
This is obviously less than ideal, because you generally don't know what the width of your rendered html will be until you render it. My current solution is to render it once with width=device-width, then render it again with width=X, where X is the actual width of the rendered page the first time.
Android Webview - Webpage should fit the device screen
You have to calculate the scale that you need to use manually, rather than setting to 30.
private int getScale(){
Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int width = display.getWidth();
Double val = new Double(width)/new Double(PIC_WIDTH);
val = val * 100d;
return val.intValue();
}
Then use
WebView web = new WebView(this);
web.setPadding(0, 0, 0, 0);
web.setInitialScale(getScale());
How to determine the content size of a WKWebView?
I think I read every answer on this subject and all I had was part of the solution. Most of the time I spent trying to implement KVO method as described by @davew, which occasionally worked, but most of the time left a white space under the content of a WKWebView container. I also implemented @David Beck suggestion and made the container height to be 0 thus avoiding the possibility that the problem occurs if the container height is larger that that of the content. In spite of that I had that occasional blank space.
So, for me, "contentSize" observer had a lot of flaws. I do not have a lot of experience with web technologies so I cannot answer what was the problem with this solution, but i saw that if I only print height in the console but do not do anything with it (eg. resize the constraints), it jumps to some number (e.g. 5000) and than goes to the number before that highest one (e.g. 2500 - which turns out to be the correct one). If I do set the height constraint to the height which I get from "contentSize" it sets itself to the highest number it gets and never gets resized to the correct one - which is, again, mentioned by @David Beck comment.
After lots of experiments I've managed to find a solution that works for me:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
self.webView.evaluateJavaScript("document.readyState", completionHandler: { (complete, error) in
if complete != nil {
self.webView.evaluateJavaScript("document.body.scrollHeight", completionHandler: { (height, error) in
self.containerHeight.constant = height as! CGFloat
})
}
})
}
Of course, it is important to set the constraints correctly so that scrollView resizes according to the containerHeight constraint.
As it turns out didFinish navigation method never gets called when I wanted, but having set document.readyState
step, the next one (document.body.offsetHeight
) gets called at the right moment, returning me the right number for height.
Related Topics
On Hover of Child, Change Background Color of Parent Container (Css Only)
How to Type Text With Hat "^" in HTML
Html/Css - Make Alert Disappear After a Few Seconds
How to Prevent Line-Break in a Column of a Table Cell (Not a Single Cell)
How to Toggle Mat-Expansion-Panel With Button Click
How to Get the Client Ip Address from Browser in Angular (Typescript)
Position Absolute But Relative to Parent
How to Auto-Resize an Image to Fit a 'Div' Container
Why Doesn't Nth-Of-Type/Nth-Child Work on Nested Elements
How to Remove Margin Space Around Body or Clear Default CSS Styles
Force HTML Content to Fit in Device Width With Wkwebview
Preventing Overlap of Multiple Fixed Positioned Elements
How to Display Multiple Lines of Text in Svg
How to Hide Link Information At the Bottom Left/Right of the Browser on Hover
Make Container Shrink-To-Fit Child Elements as They Wrap
How to Align Content of a Div to the Bottom