近来在处理的一个iPad上的app,用到了UIWebView显示广告,广告有竖屏和横屏两种不同的形式。处理方法不难,创建广告webview,设置frame,加入到view中。旋转的时候分别load对应的广告html地址,再设置webview的frame。几句代码,功能实现了,测试也通过了。但多旋转几次,会发现有个奇怪的问题,广告html会不断被拉伸,高度越来越大。输出log,看到webview中的contentSize中的height每次递增8像素。原来是这个原因,估计是旋转时,webview的宽度有变化,所以高度也相应的缩放就慢慢增大了。找到了原因,重设contentSize就可以了嘛。事实往往跟想象是有差距的,一测试,问题依旧。这下傻眼了,重设了contentSize,但完全没效果。再想一下,会不会是有什么属性可以控制它的内容不随大小而缩放的呢,找了一遍,没找到相应的属性。各种属性都试过了,包括scalesPageToFit,通过stringByEvaluatingJavaScriptFromString利用javascript语句设置contentsize高度,reload等等方法,问题依旧,还是解决不了。
正在迷茫之际,想想看是不是设置错了subview了。之前试过直接设置uiwebview的scrollview的frame,但没看到有效果。会不会还有其他subview。于是试着遍历UIWebView的所有subview,结果无意发现有个UIWebBrowserView的子视图,看看名字觉得这个象是真正显示web的视图。于是试试打印这个view的大小,并修改成需要的尺寸,结果惊奇的发现,之前递增的8像素就是它增加的,而重设了大小后,拉伸情况再也没出现了。shit,忍不住爆了一句粗口,想不到改个大小还要费这么大的劲。是自己了解不多还是api的bug呢,想不懂,之前查阅资料的时候,也看过有人问过类似的问题(问题地址:http://www.devdiv.com/forum.php?mod=viewthread&tid=194580),但没看到有解决办法。希望以后可以了解到解决这个问题的正统方法。也望有高手能指点迷津,以解开我这个疑问。
解决的代码如下:
- (void)fitContentForWebviewResize
{
for (UIView *subview in m_adView.subviews)
{
NSLog(@"subview class %@", NSStringFromClass([subview class]));
if ([[subview class] isSubclassOfClass: [UIScrollView class]])
{
for (UIView *subview2 in subview.subviews)
{
NSLog(@"subview class %@", NSStringFromClass([subview2 class]));
if ([[subview2 class] isSubclassOfClass: NSClassFromString(@"UIWebBrowserView")])
{
CGRect scrollFrame = subview2.frame;
NSLog(@"%@", NSStringFromCGRect(scrollFrame));
subview2.frame = CGRectMake(0, 0, m_adView.frame.size.width, 100);
break;
}
}
CGRect scrollFrame = subview.frame;
NSLog(@"%@", NSStringFromCGRect(scrollFrame));
break;
}
}
}