UIWebView旋转后调整文本大小:寻找神奇的bug或我的愚蠢的解释

所以我有UIWebView在我的应用程序,我加载一些HTML(文章),把一些CSS,使一切更好。 这是简单明了的,一切都是完美的,直到我尝试添加阅读景观function,然后我已经注意到,UIWebView忽略任何CSS“字体大小”,我已经放在HTML中,并增加字体大小后,旋转到横向模式急剧增加。

我花了大约4-5个小时(我是新手编程的Iphone应用程序,但我很固执,当谈到做正确的事情)试图解决它。 试了很多很多的configuration选项 – 什么都没有。

今晚有些神奇的事情发生了。 只要看看源代码:

与Bug的风景:

r = CGRectMake(0.0, 0.0, 480.0, 320.0); [adView.view removeFromSuperview]; if (!isFullScreen) { minus = 50 + minus; [controlsView setFrame:CGRectMake(0, r.size.height - 50, r.size.width, 50)]; } else { minus = 20; } [textView setFrame:CGRectMake(0, 0, r.size.width, r.size.height - minus)]; [scrollView setFrame:CGRectMake(0, 0, r.size.width, r.size.height - minus)]; 

风景固定(字体大小不再改变):

 r = CGRectMake(0.0, 0.0, 480.0, 320.0); [adView.view removeFromSuperview]; if (!isFullScreen) { minus = 50 + minus; [controlsView setFrame:CGRectMake(0, r.size.height - 50, r.size.width, 50)]; } else { minus = 20; } [textView setFrame:CGRectMake(0, 0, r.size.width, r.size.height - minus)]; [scrollView setFrame:CGRectMake(0, 0, r.size.width, r.size.height - minus)]; if (!isFullScreen) { minus = 1 + minus; } else { minus = 20+1; } [textView setFrame:CGRectMake(0, 0, r.size.width, r.size.height - minus)]; [scrollView setFrame:CGRectMake(0, 0, r.size.width, r.size.height - minus)]; 

正如你所看到的,我只是再次添加了相同的代码,并增加了一个点的余量(减去)。 并再次setFrame(不,它不修复只有一组setFramesresize)。

我很高兴它的工作,但我想知道如何和为什么,所以我可以做到“正确的方式”,因为现在的代码看起来很愚蠢,并在应用程序的底部有1点的高余裕。

不要问为什么我试图复制粘贴相同的代码。

Safari网页内容指南还提到如何禁用CSS中的文本自动大小,这解决了我的情况。

 html { -webkit-text-size-adjust: none; /* Never autoresize text */ } 

神奇的解决scheme是:

 <meta name='viewport' content='width=device-width; initial-scale=1.0; maximum-scale=1.0;'> 

如果只有我知道这个星期前..那么多时间,那么多的神经迷失了..

使用前两个答案,CSS属性:

 html { -webkit-text-size-adjust: none; /* Never autoresize text */ } 

和meta标签:

 <meta name='viewport' content='width=device-width; initial-scale=1.0; maximum-scale=1.0;'> 

我能够注入到现有的网站,使用此JavaScript代码:

 var style = document.createElement(\"style\"); document.head.appendChild(style); style.innerHTML = "html{-webkit-text-size-adjust: none;}"; var viewPortTag=document.createElement('meta'); viewPortTag.id="viewport"; viewPortTag.name = "viewport"; viewPortTag.content = "width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"; document.getElementsByTagName('head')[0].appendChild(viewPortTag); 

使用UIWebViewDelegate中的webViewDidFinishLoad:

 - (void)webViewDidFinishLoad:(UIWebView *)webView{ NSString *javascript = @"var style = document.createElement(\"style\"); document.head.appendChild(style); style.innerHTML = \"html{-webkit-text-size-adjust: none;}\";var viewPortTag=document.createElement('meta');viewPortTag.id=\"viewport\";viewPortTag.name = \"viewport\";viewPortTag.content = \"width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\";document.getElementsByTagName('head')[0].appendChild(viewPortTag);"; [webView stringByEvaluatingJavaScriptFromString:javascript]; } 

你可能只需要阅读这个

http://developer.apple.com/safari/library/documentation/appleapplications/reference/safariwebcontent/UsingtheViewport/UsingtheViewport.html

同样,如果仅指定视口宽度,则会推断高度和初始缩放比例。 图3-15显示了当视口宽度设置为320时,同一个网页的渲染。请注意,纵向方向的渲染方式与图3-14中的相同,但横向方向的宽度保持为320像素, 初始缩放并且在用户改变横向时具有放大的效果。

我试过你的情况,但没有运气。

解决scheme为我工作是:

[webView reload];