web-dev-qa-db-ja.com

[WebActionDisablingCALayerDelegate setBeingRemoved:]のUIWebViewスロー例外

IOS 8に対して実行すると、UIWebViewの深い腸から次の例外が発生し始めました。

[WebActionDisablingCALayerDelegate setBeingRemoved:]:認識されないセレクターがインスタンス0x167ee900に送信されました

* webKitはwebView:willRemoveScrollingLayer:withContentsLayer:forNode:でキャッチされなかった例外を破棄しました:デリゲート:-[WebActionDisablingCALayerDelegate setBeingRemoved:

これは、UIWebViewの制約を変更してから呼び出したときに発生します。

 self.webViewWidthConstraints.constant = newWidth;
 [self.webView setNeedsLayout];
 [self.webView layoutIfNeeded];

(これにより、Webviewのコンテンツが幅に合わせて再レンダリングされます)。

幸いなことに、例外は破棄されるため、アプリはクラッシュしません。なぜこれが起こっているのですか、それを防ぐ方法はありますか?

43
Arie Litovsky

「-webkit-transform:translateZ(0px);」を追加することにより、スクロール可能なコンテンツ(スクロール可能なコンテナ内にdivがあります)に、問題が修正されました。お役に立てれば。

12
maidbarion

これがあなたのケースであるかどうかはわかりませんが、iOS 8でもこの問題が発生し始めており、iframeで次のCSSプロパティを使用するまで追跡しました。

-webkit-overflow-scrolling: touch;

削除した後、これらのエラーメッセージはなくなりました。

注:私の場合、制約の変更に応じては発生しませんでしたが、HTMLをナビゲートしているときに発生しました。

9
André Morujão

与えられた答えはどれも私を助けることができないので、Objective-Cランタイムの助けを借りてこの問題を解決する必要がありました。

最初に、単純な関数を提供しました:

id setBeingRemoved(id self, SEL selector, ...)
{
   return nil;
}

次に、これらの2行:

    Class class = NSClassFromString(@"WebActionDisablingCALayerDelegate");
    class_addMethod(class, @selector(setBeingRemoved:), setBeingRemoved, NULL);

そしてそれは動作します。

7

UIWebViewの代わりに WKWebView を使用します。 (最初にiOS 8に含まれていました)。私はそれを試しましたが、このバグはないようです。また、前バージョンと比較してパフォーマンスが向上する場合があります。 Appleは近い将来、事実上の標準になりますが、そうでない場合はそうです。UIWebViewに似たインターフェースとデリゲートがあります。間違いなく試してみる価値があります。

IOS 8より前のバージョンをターゲットにしている場合、フォールバック手順を実装してUIWebViewまたはWKWebViewのいずれかをロードできます。 ここにいます すぐに使用可能な実装

4
webo80

私の場合、問題はiframeコンテンツ内の<table>でした。テーブルの幅は、CSSで定義されたiframeの幅よりも大きかった。 iframeスクロールはオフで、テーブルはiframeをテーブルの計算された最小幅まで引き伸ばしました。その他の副作用:iframeのコンテンツは完全に表示されませんでした(右側が切断されました)。

|--- Available viewport width -------------|
|--- defined and estimated iframe width ---|
|--- table width in the iframe content > than defined iframe width ---|
|--- iframe stretched to the calculated table width ------------------|

Iframeコンテンツからテーブルを削除すると、問題が修正されました。

0
medium8

@AndréMorujãoが答えたように、スクロール要素から-webkit-overflow-scrolling:touch;を削除すると例外が停止します。しかし、display:none cssをスクロール要素に追加したときにのみ例外が発生することがわかりました。

編集:display:noneを独自のクラス-webkit-overflow-scrolling:touch;内に配置し、jqueryを使用してスクロール要素からそのクラスを追加および削除することにより、.scrollを引き続き使用してスクロール要素を非表示にできました。それを隠した後:

<style>
    .scroll
    {
         -webkit-overflow-scrolling:touch;
    }
</style>
<script>
function hide()
{
    $('#scrolling_element).removeClass('scroll');
    $('#scrolling_element).css('display', 'none');
}
function show()
{
    $('#scrolling_element).css('display', 'block');
    $('#scrolling_element).addClass('scroll');
}
</script>
0
Mark