私は、ユーザーがTextViewでフォントサイズを変更できるブックアプリを開発しています。
ユーザーがフォントサイズを変更すると、アプリは現在のテキスト位置を保存して、ユーザーがフォントサイズを変更した後に変更しないようにします。
ほとんどの場合は問題なく動作しますが、ユーザーがフォントサイズを変更すると、アプリでこの種のエラーが発生することがあります。それでも、これを修正する方法がわかりません。
キャッチされなかった例外 'CALayerInvalidGeometry'が原因でアプリを終了しています。理由: 'CALayerの境界にNaNが含まれています:[0 nan; 280 524]」*まずスローコールスタック:(0x3231e3e7 0x3a019963 0x3231e307 0x33edb4d7 0x33edb30d 0x3419141f 0x3419b82f 0x342d1cf1 0x3414f80d 0xe7bf1 0xe607d 0xfad35 0x34218087 0x34218111 0x34218087 0x34218015 0x3421803b 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)];
}
ここのどこかで、無効な出力が発生し、rect
の値がNaN
(「有効な浮動小数点数ではない」を意味する特別な浮動小数点数であり、最も一般的には除算が原因)になります。ゼロによる)。無効または無意味なUITextRange
を-firstRectForRange
に渡した可能性はありますか? UITextPosition *start
がテキストの最後の文字を参照している場合、最後から1文字離れた別のテキスト位置を作成するとどうなりますか?