我正在开发一个图书应用程序,用户可以在TextView上更改字体大小。
当用户更改字体大小时,应用会保存当前文本位置,以便在用户更改字体大小后不会更改。
在大多数情况下它运行良好,但有时,当用户更改字体大小时,应用程序会出现此类错误,我仍然无法告诉如何解决此问题。
由于未捕获的异常'CALayerInvalidGeometry'而终止应用,原因:'CALayer bounds包含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:terminate调用抛出异常
我也无法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)];
}
答案 0 :(得分:16)
此处某处的某处,您获得的输出无效,导致rect
具有值NaN
(特殊浮点值表示“不是有效的浮点数”,最常见的原因是被零除)。您是否可能将无效或无意义的UITextRange
传递给-firstRectForRange
?如果UITextPosition *start
引用文本中的最后一个字符,然后再创建一个超过结尾的一个字符的文本位置,会发生什么?
答案 1 :(得分:0)
在我的情况下,代码执行0.0 / 0.0结果-nan(无穷大),并进一步用于转换为double。
我添加了一个保护条件,以确保值> 0.0