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のコンテンツが幅に合わせて再レンダリングされます)。
幸いなことに、例外は破棄されるため、アプリはクラッシュしません。なぜこれが起こっているのですか、それを防ぐ方法はありますか?
「-webkit-transform:translateZ(0px);」を追加することにより、スクロール可能なコンテンツ(スクロール可能なコンテナ内にdivがあります)に、問題が修正されました。お役に立てれば。
これがあなたのケースであるかどうかはわかりませんが、iOS 8でもこの問題が発生し始めており、iframeで次のCSSプロパティを使用するまで追跡しました。
-webkit-overflow-scrolling: touch;
削除した後、これらのエラーメッセージはなくなりました。
注:私の場合、制約の変更に応じては発生しませんでしたが、HTMLをナビゲートしているときに発生しました。
与えられた答えはどれも私を助けることができないので、Objective-Cランタイムの助けを借りてこの問題を解決する必要がありました。
最初に、単純な関数を提供しました:
id setBeingRemoved(id self, SEL selector, ...)
{
return nil;
}
次に、これらの2行:
Class class = NSClassFromString(@"WebActionDisablingCALayerDelegate");
class_addMethod(class, @selector(setBeingRemoved:), setBeingRemoved, NULL);
そしてそれは動作します。
私の場合、問題は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コンテンツからテーブルを削除すると、問題が修正されました。
@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>