由于未捕获的异常“CALayerInvalidGeometry”而终止应用程序,原因:“CALayer bounds contains NaN: [0 nan; 280 524]'

Posted

技术标签:

【中文标题】由于未捕获的异常“CALayerInvalidGeometry”而终止应用程序,原因:“CALayer bounds contains NaN: [0 nan; 280 524]\'【英文标题】:Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer bounds contains NaN: [0 nan; 280 524]'由于未捕获的异常“CALayerInvalidGeometry”而终止应用程序,原因:“CALayer bounds contains NaN: [0 nan; 280 524]' 【发布时间】:2013-03-29 15:34:57 【问题描述】:

我正在开发一个图书应用程序,用户可以在其中更改 TextView 上的字体大小。

当用户更改字体大小时,应用程序会保存当前文本位置,而不是在用户更改字体大小后更改。

它在大多数情况下都可以正常工作,但有时,当用户更改字体大小时,应用程序会出现这种错误,我仍然不知道如何解决这个问题。

由于未捕获的异常“CALayerInvalidGeometry”而终止应用程序,原因:“CALayer bounds contains NaN: [0 nan; 280 524]' * 首先抛出调用栈: (0x3231e3e7 0x3a019963 0x3231e307 0x33edb4d7 0x33edb30d 0x3419141f 0x3419b82f 0x342d1cf1 0x3414f80d 0xe7bf1 0xe607d 0xfad35 0x34218087 0x34218111 0x34218087 0x3421803b 0x34218015 0x342178cb 0x34217db9 0x341405f9 0x3412d8e1 0x3412d1ef 0x35e455f7 0x35e45227 0x322f33e7 0x322f338b 0x322f220f 0x3226523d 0x322650c9 0x35e4433b 0x341812b9 0xdf9f1 0xdf978) libc++abi.dylib:终止调用抛出异常

我也无法 100% 重现此问题,因为此问题偶尔会发生。

这是代码。有没有人有解决这个问题的想法?提前致谢。

- (UITextRange *)getCurrentTextRange:(UITextView *)textView 

    CGRect bounds               = textView.bounds;
    UITextPosition *start       = [textView characterRangeAtPoint:bounds.origin].start;
    UITextPosition *end         = [textView positionFromPosition:start offset:1];
    UITextRange *textRange      = [textView textRangeFromPosition:start toPosition:end];

    return textRange;


- (void)changeFontSize:(UIButton*)button 

    UITextRange *textRange  = [self getCurrentTextRange:_textView];
    int fontSize            = [[NSUserDefaults standardUserDefaults] integerForKey:@"fontSize"];

    //button.tag == 1 => decreaseFontSize
    if (button.tag == 1) 

        //set a minimum size
        if (fontSize <= [LSUniversalManager getFontSizeForMinimum]) 
            return;
        

        fontSize--;

    //button.tag == 2 => increaseFontSize
     else if (button.tag == 2)         
        fontSize++;
    

    _textView.font      = [UIFont systemFontOfSize:fontSize];
    [[NSUserDefaults standardUserDefaults] setInteger:fontSize forKey:@"fontSize"];

    //avoid shifting the scroll position after changing font size
    CGRect rect = [_textView firstRectForRange:textRange];
    [_textView setContentOffset:CGPointMake(0, rect.origin.y)];

【问题讨论】:

【参考方案1】:

在此处的某处,您会得到一个无效的输出,导致rect 具有值NaN(一个特殊的浮点值,意思是“不是有效的浮点数”,最常见的原因是除以零) .您是否有可能将无效或无意义的UITextRange 传递给-firstRectForRange?如果UITextPosition *start 引用了文本中的最后一个字符,当您创建另一个文本位置时,会发生什么情况?

【讨论】:

感谢您的 cmets,我相信当您提到的 textRange 中的值无效时,这种情况会发生在 [_textView firstRectForRange:textRange] 中。您认为我可以在以某种方式使用 firstRectForRange 之前检查 textRange 是否有效吗?抱歉,我不知道如何重现这种情况。 >>>如果 UITextPosition *start 引用会发生什么...也许我应该尝试一下。 UITextPosition *end = [textView characterRangeAtPoint:CGPointMake(CGRectGetMaxX(bounds), CGRectGetMaxY(bounds))].end;在 getCurrentTextRange 方法中。 如果有其他人碰到它...我有一个UIPopoverController 从屏幕边缘的一个按钮呈现出来,并且不小心将它允许的方向放在外面。没有空间显示 == 这个错误。 在我的情况下,它是通过尝试显示一个 UIWebView 触发的,该 UIWebView 是从一个带有无效数据的 NSData 对象创建的,可能来自一个空文件。【参考方案2】:

在我的例子中,代码执行 0.0 / 0.0 结果 -nan(无穷大)并进一步用于转换为双精度。

我添加了一个保护条件以确保值 > 0.0

【讨论】:

以上是关于由于未捕获的异常“CALayerInvalidGeometry”而终止应用程序,原因:“CALayer bounds contains NaN: [0 nan; 280 524]'的主要内容,如果未能解决你的问题,请参考以下文章

由于未捕获的异常而终止应用程序 [UIImageView _isResizable]

由于未捕获的异常而终止应用程序,同时加载视图

由于未捕获的异常“NSInternalInconsistencyException”错误而终止应用程序

“由于未捕获的异常而终止应用程序”在推送视图控制器时崩溃

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序