问题描述
我正在开发一个图书应用程序,用户可以在其中更改 TextView 上的字体大小.
I am developing a book app where users can change the font size on the TextView.
当用户更改字体大小时,应用程序会保存当前文本位置,而不是在用户更改字体大小后更改.
when users change the font size, the app save the current text position not to change that after users did changing font size.
它在大多数情况下都可以正常工作,但有时,当用户更改字体大小时,应用程序会出现这种错误,我仍然不知道如何解决这个问题.
It works fine in most cases, but sometimes, when users change the font size, the app gets this kind of error, and I still can't tell how to fix this.
由于未捕获的异常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% 重现此问题,因为此问题偶尔会发生.
I also can't reproduce this issue 100% since this issue happens occasionally.
这是代码.有没有人有解决这个问题的想法?提前致谢.
This is the code. Does anybody have an idea to fix this? Thanks in advance.
- (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)];
}
推荐答案
在这里的某个地方,你得到一个无效的输出,导致 rect
的值为 NaN
(一个特殊的浮点值,意思是不是一个有效的浮点数",最常见的原因是被零除).您是否有可能将无效或无意义的 UITextRange
传递给 -firstRectForRange
?如果 UITextPosition *start
引用文本中的最后一个字符,然后您创建另一个文本位置,该位置比末尾多一个字符,会发生什么?
Somewhere along the line here, you are getting an invalid output that is causing rect
to have the value NaN
(a special float value meaning "not a valid float number", most commonly caused by division by zero). Is it possible that you have passed an invalid or nonsensical UITextRange
to -firstRectForRange
? What happens if UITextPosition *start
references the last character in the text, when you then create another text position that is one character past the end?
这篇关于由于未捕获的异常“CALayerInvalidGeometry"而终止应用程序,原因:“CALayer bounds contains NaN: [0 nan;280 524]'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!