2013-09-21 14 views
19

Właśnie znalazłem irytujący błąd z nową właściwością keyboardDismissMode z scroll view. Gdy używa się tego z text view o wartości UIScrollViewKeyboardDismissModeInteractive i klawiatura jest odrzucana, wydaje się, że scroll view przeskakuje do góry, zanim będzie dalej zwalniać.UITextView keyboardDismissMode Bug

Złożyłem zgłoszenie błędu w Apple, ale potrzebuję obejścia. Próbowałem DAKeyboardControl bez nowego wsparcia iOS7, który za kulisami używa keyboardDismissMode i nadal to robi, co dla mnie oznacza, że ​​jest to o wiele głębszy problem.

Wszelkie sugestie?

+0

Próbuję odtworzyć. Dodałem widok tekstowy nad oknem i mam długi tekst. Ustawię tryb zwolnienia klawiatury na interaktywny. Dodałem implementację 'scrollViewDidScroll:', aby złapać dziwne skoki. Działa zgodnie z oczekiwaniami. Czy mógłbyś bardziej szczegółowo opisać swoją sprawę użycia? –

+0

Wysłałem mój przykładowy projekt tutaj: http://cl.ly/013q0t022j0l. Projekt jest pojedynczym widokiem tekstowym w storyboardie z tekstem lorem ipsum. Sterownik widoku rejestruje, czy klawiatura ukryła powiadomienie, a także jest delegatem widoku tekstowego. Zajmuję się rejestrowaniem powiadomień ukrytych, a także pozycją y przesunięcia treści, gdy przewijany widok jest przewinięty. – Dino

+0

Jeśli uruchomisz projekt i odłączysz klawiaturę, zobaczysz kilka bardzo błędnych liczb pochodzących z metody scrollViewDidScroll po wywołaniu powiadomienia ukrytego. – Dino

Odpowiedz

0

Wygląda na to, że jest to błąd lub po prostu nie idealny stan domyślny. Ale na podstawie kodu w projekcie testowym coś jak poniżej może działać po drobniejszym dostrojeniu.

Występują dwa problemy z kodem przykładowym, jednym z nich jest to, że nie robisz nic o rozmiarze tekstu, gdy klawiatura się pojawi, więc nie możesz użyć ani zobaczyć tekstu pod klawiaturą. Istnieją inne rozwiązania, ale szybkie i brudne rozwiązanie polega na zmianie rozmiaru klatki (w aplikacji do składania chciałbym również pobrać informacje o animacji i animować zmianę ramki widoku, aby dopasować ją do animacji klawiatury, która wykracza poza zakres tego pytania). Robisz to w 'willShow' lub podobnym, i wracasz do 'didHide' lub podobnego.

Następnie odsunięcie zawartości jest fałdowane, gdy jest ukryte i pojawiają się dziwne stany podczas przeciągania poza zasłony i wokół niej w celu ukrycia i przewinięcia zmian widoku. Po prostu zapiszę stan i "naprawię" go, gdy klawiatura zniknie, a ja zaktualizowałem widok tekstu.

Utworzyłem kilka właściwości i ujście w serii ujęć do krówki z widokiem tekstu.

 
- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil]; 
} 

- (void) keyboardWillShow:(NSNotification *)notification 
{ 
    NSDictionary * info = [notification userInfo]; 
    CGSize size = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    CGRect rect = self.textView.frame; 
    rect.size.height -= size.height; 
    self.textView.frame = rect; 
} 

- (void)keyboardDidHide:(NSNotification *)notification 
{ 
    NSLog(@"====== keyboardDidHide ======="); 

    NSDictionary * info = [notification userInfo]; 
    CGSize size = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    CGRect rect = self.textView.frame; 
    rect.size.height += size.height; 
    self.textView.frame = rect; 


    self.hidingKeyboard = YES; 
} 

- (void) scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    NSLog(@"%f", scrollView.contentOffset.y); 
    if(self.hidingKeyboard == YES) 
    { 
     scrollView.contentOffset = self.lastOffset; 
     self.hidingKeyboard = NO; 
     NSLog(@"====== reset ======="); 
    } 
    else 
     self.lastOffset = scrollView.contentOffset; 
} 
+0

Celem przykładowego kodu było zademonstrowanie błędu spowodowanego przez odrzucenie klawiatury. Doceniam fakt, że nie można wyświetlić tekstu za klawiaturą, ale nie ma to nic wspólnego z błędem, o który pytam. Nie uwzględniając kodu, który zmienia ramkę, gdy pojawia się klawiatura, możemy wykluczyć, że powoduje/przyczynia się do problemu. – Dino

+0

Również zaimplementowałem twoją poprawkę dla pomieszanego przesunięcia zawartości po ukryciu klawiatury i nie działa, nawet gdy nie ma opóźnienia. – Dino

+0

Opisz więcej interakcji, którą próbujesz i co widzisz.Kiedy przeciągam z textView przez klawiaturę w dół ekranu, patelnie klawiatury i powyższy kod zachowują tekst, który widzę na ekranie w tej samej lokalizacji, jakiej oczekuję (tzn. Przeciągnę go za pomocą klawiatury). – EricLeaf

1

tego problemu lepiej kodu z scrollviewDelegete i po prostu wymienić, gdy chcesz odwołać klawiaturę poprzez ResignFirstResponder