2013-04-07 49 views
7

我正在开发一个图书应用程序,用户可以在TextView上更改字体大小。终止应用程序由于未捕获的异常“CALayerInvalidGeometry”,原因:'CALayer界限包含NaN:[0 nan; 280 524]'

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

它在大多数情况下工作正常,但有时,当用户更改字体大小时,应用程序会得到这种错误,并且我仍然无法知道如何解决此问题。

由于未捕获的异常“CALayerInvalidGeometry”导致应用终止,原因:'CALayer界限包含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)]; 
} 

回答

13

沿此线的某处你得到,是造成rect具有价值NaN无效输出(特殊浮点值的意思是“不是一个有效的浮点数”,最常见原因被零除) 。是否有可能通过了无效或无意义的UITextRange-firstRectForRange?如果UITextPosition *start引用了文本中的最后一个字符,那么当您创建另一个文本位置是最后一个字符时会发生什么?

+0

感谢您的评论,我相信当textRange在其中有无效值时,这个cruch发生在[_textView firstRectForRange:textRange]中,正如您所提到的。 你是否认为我可以检查textRange是否有效,然后以某种方式使用firstRectForRange? 对不起,我不知道如何重现这种情况。 >>>如果UITextPosition *开始引用会发生什么...... 也许我应该试试这个。 UITextPosition * end = [textView characterRangeAtPoint:CGPointMake(CGRectGetMaxX(bounds),CGRectGetMaxY(bounds))]。end;在getCurrentTextRange方法。 – 2013-04-08 03:46:47

+1

如果有其他人遇到过它......我有一个'UIPopoverController',通过屏幕边缘的一个按钮呈现,并且意外地将允许的方向放到了外面。没有空间来呈现==这个错误。 – WCByrne 2015-09-03 19:46:22

+0

在我的情况下,它是通过尝试显示一个UIWebView触发的,该UIWebView是从一个NSData对象创建的,这个对象的数据可能是无效的,可能来自一个空文件。 – jk7 2016-09-23 23:56:56

相关问题