4

私はこのメタタグを持っています:

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

そして、私はscalesPageToFitを設定しています:

webView.scalesPageToFit = YES;

最初はこれは正しく機能します。ポートレートからランドスケープに移動すると、ズームインするため、デバイスの幅は常に768pxになります。問題なく前後に移動できます(ポートレート<->風景)。

仮想キーボードをアクティブにすると、contentEditableまたはテキスト領域を介しているかどうかに関係なく、キーボードを閉じた後でも、完全に機能しなくなります。

これはUIWebViewのバグですか?この作業を行うために他に何かする必要がありますか?使用できる回避策はありますか?幅は、向きに関係なく、768pxである必要があります。

4

2 に答える 2

1

AppleのプライベートクラスUIDocumentViewのバグのようです。viewportConfigurationsDidChangeキーボードがアクティブ化された後、何らかの理由でズームスケールでスタックします。これは、を呼び出すことによって設定され_setDocumentScaleます。たとえば、1.333に変更することになっている場合、1.0でスタックします。

UIWebDocumentViewのカテゴリを作成することで「修正可能」になります。これは、これらのメソッドを実装しないUIDocumentViewのサブクラスです(スーパーを呼び出すことができます)。

最善の努力にもかかわらず、パブリックAPIを使用してこれを修正する方法を見つけることができませんでした。UIScrollViewのズームレベルをいじってみましたが、正しく機能させることができませんでした。コンテンツがシフトし、他の奇妙なことが起こります。JavaScriptでやってみました。

したがって、それを修正する唯一の方法は、プライベートクラスのカテゴリを使用することです。

これは、アプリストアで承認されることはありません。

したがって、Appleがこれを修正するまで、SOL。

于 2012-10-28T07:41:53.920 に答える
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];
}

resetScaleWebビューの境界が変更された後に呼び出します。

于 2013-11-21T20:17:03.650 に答える