2013-04-07 6 views
7

私はTextViewのフォントサイズを変更できるブックアプリケーションを開発しています。キャッチされていない例外 'CALayerInvalidGeometry'のためアプリを終了しています、理由: 'CALayer bounds contains NaN:[0ナノ; 280 524] '

ユーザーがフォントサイズを変更したときに、ユーザーがフォントサイズを変更した後に変更しないように現在のテキストの位置を保存します。

ほとんどの場合、うまく動作しますが、ユーザーがフォントサイズを変更すると、この種のエラーが発生することがあります。これを修正する方法はまだわかりません。

キャッチされていない例外 'CALayerInvalidGeometry'のためアプリを終了しています。理由: 'CALayer bounds contains NaN:[0ナノ; 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

どこかここのラインに沿って、あなたが値NaN(最も一般的にゼロ除算によって引き起こされる「無効な浮動小数点数」を、意味特殊な浮動小数点値)を持つようにrectを引き起こしている不正な出力を得ています。無効なまたは無意味なUITextRange-firstRectForRangeに渡した可能性はありますか? UITextPosition *startがテキストの最後の文字を参照すると、最後の文字が1文字後になるとどうなりますか?

+0

あなたのコメントをありがとう、私はあなたが言及したようにtextRangeが無効な値を持っている場合、このcruchは[_textView firstRectForRange:textRange]で起こると思います。 firstRectForRangeを何とか使用する前に、textRangeが有効かどうかチェックできますか? 申し訳ありませんが、私はこの状況を再現する方法を伝えることはできません。 >>> UITextPosition *が参照を開始するとどうなりますか... 多分私はこれを試すべきです。 UITextPosition * end = [textView characterRangeAtPoint:CGPointMake(CGRectGetMaxX(bounds)、CGRectGetMaxY(bounds))]。 getCurrentTextRangeメソッドで取得します。 –

+1

他の誰かがそれに遭遇した場合...私は、画面の端にあるボタンから提示された 'UIPopoverController'を持っていて、誤ってそれを外側に向ける許可された方向を持っていました。このエラーを提示する余地はありません。 – WCByrne

+0

私の場合、NSDataオブジェクトから作成されたUIWebViewを無効なデータで表示しようとすると、空のファイルからトリガーされていました。 – jk7

関連する問題