2013-04-07 10 views
7

Zajmuję się tworzeniem aplikacji książkowej, w której użytkownicy mogą zmieniać rozmiar czcionki w TextView.Kończenie aplikacji z powodu nieprzechwyconego wyjątku "CALayerInvalidGeometry", powód: "Granice CALayer zawierają NaN: [0 nan; 280 524] '

kiedy użytkownicy zmieniają rozmiar czcionki, aplikacja zapisuje aktualną pozycję tekstową, aby nie zmieniać tego po zmianie rozmiaru czcionki przez użytkowników.

W większości przypadków działa dobrze, ale czasami, gdy użytkownicy zmieniają rozmiar czcionki, aplikacja otrzymuje taki błąd i nadal nie mogę stwierdzić, jak to naprawić.

Kończenie aplikacji z powodu nieprzechwyconego wyjątku "CALayerInvalidGeometry", powód: "Granice CALayer zawierają NaN: [0 nan; 280 524]” * pierwsze wezwanie rzut stosu: (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: zakończ wywołanie wyrzucając wyjątek

Nie mogę również odtworzyć tego problemu w 100%, ponieważ ten problem zdarza się sporadycznie.

To jest kod. Czy ktoś ma pomysł, aby to naprawić? Z góry dziękuję.

- (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)]; 
} 

Odpowiedz

13

Gdzieś wzdłuż linii Tutaj są coraz nieprawidłowy wyjście, które jest przyczyną rect mieć wartość NaN (specjalny wartość pływak oznacza „nie jest prawidłową liczbę typu float”, najczęściej spowodowane przez dzielenie przez zero) . Czy to możliwe, że zdałeś nieważny lub bezsensowny numer: UITextRange do -firstRectForRange? Co się stanie, jeśli UITextPosition *start odwołuje się do ostatniego znaku w tekście, gdy utworzysz kolejną pozycję tekstu, która jest jedną postacią za końcem?

+0

Dziękuję za komentarze, uważam, że ten cruch ma miejsce w [_textView firstRectForRange: textRange], gdy textRange ma w nim nieprawidłową wartość, o której wspomniałeś. Czy myślisz, że mogę sprawdzić, czy textRange jest ważny przed jakimś użyciem firstRectForRange? Niestety, nie mogę powiedzieć, jak odtworzyć tę sytuację. >>> Co się stanie, jeśli UITextPosition * rozpocznie odniesienia ... Może powinienem spróbować z tym. UITextPosition * end = [textView characterRangeAtPoint: CGPointMake (CGRectGetMaxX (bounds), CGRectGetMaxY (bounds))]. End; w metodzie getCurrentTextRange. –

+1

Jeśli ktoś jeszcze kiedykolwiek się w to wplątał ... Miałem 'UIPopoverController' wyświetlający się z przycisku na krawędzi ekranu i przypadkowo miał dozwolony kierunek kładąc go na zewnątrz. Nie ma miejsca na przedstawienie == tego błędu. – WCByrne

+0

W moim przypadku został on wywołany przez próbę wyświetlenia UIWebView, który został utworzony z obiektu NSData z niepoprawnymi danymi, prawdopodobnie z pustego pliku. – jk7