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;
}
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? –
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
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