键盘显示后,在UIWebView上打破scalesPageToFit?

时间:2012-09-19 02:48:58

标签: ios uiwebview

我有这个元标记:

<meta name="viewport" content="width=768, minimum-scale=1.0, user-scalable=no" />

我正在设置scalesPageToFit:

webView.scalesPageToFit = YES;

首先,这可以正常工作。当我从纵向移动到横向时,它会放大,因此设备的宽度始终为768px。我可以来回走动,没有任何问题(肖像&lt; - &gt;风景)。

一旦我激活虚拟键盘,无论是通过contentEditable还是文本区域,即使我关闭了键盘,它也会完全停止工作。

这是UIWebView中的错误吗?还有什么我需要做才能使这项工作?我可以使用一种解决方法吗?无论方向如何,宽度必须为768px。

2 个答案:

答案 0 :(得分:1)

似乎是Apple的私有类UIDocumentView的错误。因为在激活键盘后,viewportConfigurationsDidChange卡在缩放比例上的原因是什么,这是通过调用_setDocumentScale来设置的。例如,当它应该改为1.333时,它会卡在1.0上。

通过为UIWebDocumentView编写一个类别来“修复”,这是UIDocumentView的一个子类,它没有实现这些方法(所以你可以调用super)。

尽管我付出了最大的努力,但我找不到使用公共API解决此问题的方法。我试过搞乱UIScrollView的缩放级别,但我永远无法正常工作。内容会发生变化,其他奇怪的事情也会发生。甚至尝试使用JavaScript。

所以修复它的唯一方法是通过私有类的类别。

这绝不会在应用商店中获得批准。

所以,直到Apple修复此问题,SOL。

答案 1 :(得分:0)

警告:此解决方案使用私有API。任何使用此代码的应用都可能会从应用商店中被拒绝。我发布它,所以人们至少有一个有效的解决方案。

@interface UIWebDocumentView : UIView
- (void)_setDocumentScale:(float)scale;
@end

@interface UIWebView (DocumentView)
- (UIWebDocumentView *)_documentView;
@end

- (void)resetScale:(UIWebView *)webView
{
    UIWebDocumentView *webDocumentView = [webView _documentView];
    CGFloat contentWidth = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollWidth;"] floatValue];
    CGSize viewSize = webView.bounds.size;
    float scale = viewSize.width / contentWidth;
    [webDocumentView _setDocumentScale:scale];
}

在Web视图边界更改后调用resetScale