Вопрос по iphone, ios, calayer, crash – Завершение приложения из-за неисследованного исключения «CALayerInvalidGeometry», причина: «Границы CALayer содержат NaN: [0 nan; 280 524] '

10

Я занимаюсь разработкой книжного приложения, в котором пользователи могут изменять размер шрифта в TextView.

когда пользователи изменяют размер шрифта, приложение сохраняет текущую текстовую позицию, чтобы не изменять ее после того, как пользователи изменили размер шрифта.

В большинстве случаев работает нормально, но иногда, когда пользователи меняют размер шрифта, приложение получает такую ошибку, а я все еще могу »не могу сказать, как это исправить.

Завершение приложения из-за неисследованного исключения »CALayerInvalidGeometry»Причина:CALayer границ содержит NaN: [0 нан; 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: прекратить называемый метания исключение

Я тоже могуt воспроизвести эту проблему на 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  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)];
}

Ваш Ответ

1   ответ
16

вы получаете неверный вывод, который вызываетrect иметь ценностьNaN (специальное значение с плавающей запятой, означающее "недопустимый номер с плавающей точкой ", чаще всего вызванный делением на ноль). Возможно ли, что вы передали недействительный или бессмысленныйUITextRange в-firstRectForRange? Что будет еслиUITextPosition *start ссылается на последний символ в тексте, когда вы затем создаете другую текстовую позицию, которая находится на один символ за концом?

Спасибо за ваши комментарии, я полагаю, что это разделение происходит в [_textView firstRectForRange: textRange], когда textRange имеет недопустимое значение в нем, как вы упоминали. Как вы думаете, я могу проверить, является ли textRange действительным, прежде чем я как-то использовать firstRectForRange? Извини я могуРассказать, как воспроизвести эту ситуацию. >>>Что произойдет, если UITextPosition * начнет ссылаться ... Может быть, я должен попробовать с этим. UITextPosition * end = [textView characterRangeAtPoint: CGPointMake (CGRectGetMaxX (bounds), CGRectGetMaxY (bounds))]. End; в методе getCurrentTextRange. Non Umemoto
В моем случае это было вызвано попыткой отобразить UIWebView, созданный из объекта NSData с недопустимыми данными, возможно, из пустого файла. jk7
Если кто-то еще сталкивается с этим ... У меня былUIPopoverController представление от кнопки на краю экрана и случайно было разрешено направление, направив его наружу. Нет места, чтобы представить == эту ошибку. WCByrne

Похожие вопросы