UIWebView抛出[WebActionDisablingCALayerDelegate setBeingRemoved:]的异常

时间:2014-09-17 15:06:01

标签: ios objective-c uiwebview ios8

在针对iOS 8运行时,我开始看到来自UIWebView的深层内容的以下异常:

  

[WebActionDisablingCALayerDelegate setBeingRemoved:]:无法识别的选择器发送到实例0x167ee900

     

* WebKit在webView中丢弃了未捕获的异常:willRemoveScrollingLayer:withContentsLayer:forNode:delegate: - [WebActionDisablingCALayerDelegate setBeingRemoved:

当我更改UIWebView上的某些约束然后调用:

时,会发生这种情况
 self.webViewWidthConstraints.constant = newWidth;
 [self.webView setNeedsLayout];
 [self.webView layoutIfNeeded];

(这样可以重新渲染webview的内容以正确调整其宽度)。

幸运的是,异常被丢弃,因此应用程序不会崩溃。为什么会发生这种情况,有什么方法可以阻止它吗?

6 个答案:

答案 0 :(得分:12)

我发现通过添加" -webkit-transform:translateZ(0px);"对于可滚动的内容(我的可滚动容器中有一个div),它为我解决了问题。希望这会有所帮助。

答案 1 :(得分:9)

不确定这是不是你的情况,但我也开始在iOS 8上看到这个问题,我们跟踪它在iframe上使用以下CSS属性:

-webkit-overflow-scrolling: touch;

我们删除它后,我们不再收到这些错误消息。

注意:在我的情况下,它没有响应更改任何约束而发生,而是在我们浏览HTML时发生。

答案 2 :(得分:7)

由于没有给出的答案可以帮助我,我必须借助Objective-C运行时解决这个问题。

首先,我提供了一个简单的功能:

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

然后这两行:

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

它有效。

答案 3 :(得分:4)

使用WKWebView代替UIWebView 。 (它最初包含在iOS 8中)。我已经尝试过了,似乎它没有得到这个bug。此外,与前一代产品相比,它可以提高性能。似乎苹果将在不久的将来制定事实上的标准,如果不是现在的话。它的接口和委托有点类似于UIWebView。绝对值得一试。

如果你的目标是iOS 8之前的版本,你可以实现后备程序来加载UIWebView或WKWebView,here you are一个开箱即用的实现

答案 4 :(得分:0)

就我而言,问题是< table>在iframe内容中。表格宽度大于通过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内容已解决问题。

答案 5 :(得分:0)

正如@AndréMorujão所回答的那样,从滚动元素中删除-webkit-overflow-scrolling:touch;会停止异常。但我发现只有当我将display:none css添加到滚动元素时才会发生异常。

编辑:我能够继续使用display:none来隐藏我的滚动元素,方法是将-webkit-overflow-scrolling:touch;放在自己的类.scroll中,并使用jquery从我的滚动中添加和删除该类隐藏它之前和之后的元素:

<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>