Pytanie iPhone - wyświetlaj klawiaturę z prawej strony, tak jak podczas edytowania notatki w Kontaktach


Szukam sposobu na przesuwanie klawiatury z prawej strony, np. Co dzieje się w aplikacji Kontakty podczas edytowania notatki.

Mój problem polega na tym, że kiedy wywołuję [someTextView stają sięFirstResponder] w viewWillAppear, klawiatura natychmiast wyskakuje bez animacji. I kiedy nazywam to w viewDidAppear, widok najpierw przesuwa się z prawej (UINavigationController przesuwa się), a następnie klawiatura wsuwa się od dołu.

Czy można przesuwać klawiaturę z prawej strony, wraz z widokiem?


19
2017-07-15 17:28


pochodzenie


Nie mam dla ciebie odpowiedzi, ale zauważyłem dzisiaj, że AIM robi to samo co Kontakty. Prawdopodobnie jest to możliwe. - Steven Fisher
Miałem ten sam problem i udało mi się znaleźć tę odpowiedź: tutaj - Daniel Granger


Odpowiedzi:


Wszystko, co musisz zrobić, to powiedzieć, że dany widok tekstu jest pierwszym respondentem w viewDidLoad metoda kontrolera widoku, który naciskasz na stos nawigacyjny:

override func viewDidLoad() {
    super.viewDidLoad()
    someTextView.becomeFirstResponder()
}

Działa to w iOS 8. Klawiatura przesuwa się z prawej strony wraz z widokiem.


11
2017-07-18 20:43



Napisałem też mały test z użyciem tego rozwiązania i działa dokładnie tak, jak robi to aplikacja Kontakty podczas edytowania notatki. +1! - Jasarien
To jest poprawna odpowiedź, chociaż nie w całości dla mojej konkretnej sprawy (postawiła mnie na dobrej drodze). Mój widok tekstowy znajdował się w komórce z pojedynczym widokiem (ze względu na to, że chciałbym zaokrąglić granicę i być leniwym). Wygląda na to, że klawiatura tego nie lubi. Okazało się, że jest to spowodowane natychmiastowym pojawieniem się klawiatury zamiast przesuwania się z prawej strony. Twoja odpowiedź pomogła mi znaleźć przyczynę mojego problemu, więc dziękuję! - T .
To rozwiązanie nie działa w iOS 7. Czy ktoś znalazł rozwiązanie działające w iOS 7? - Alex Pretzlav
@AlexPretzlav Znalazłem rozwiązanie działające w systemie iOS 7. - ma11hew28
w moim przypadku tak nie działa ... Klawiatura jest od razu dostępna. Zauważa również, że zmiany w kontaktach nie pchają, ale edytują wbudowane?!? Używam systemu iOS8 ... - Georg


Rozwiązanie

W iOS 7, dzwoniąc becomeFirstResponder na _textView w viewDidLayoutSubviews Prace.

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    [_textView becomeFirstResponder];
}

Uwaga: robi to viewWillLayoutSubviews działa również.

Wyjaśnienie

Przeczytaj dyskusję w dokumentach dla becomeFirstResponder.

Możesz wywołać tę metodę, aby uczynić obiekt odpowiadający, taki jak widok pierwszego respondenta. Powinieneś jednak wywoływać go tylko w tym widoku, jeśli jest on częścią hierarchii widoków. Jeśli widok jest window właściwość posiada UIWindow obiekt został zainstalowany w hierarchii widoków; jeśli wróci nil, widok jest odłączony od dowolnej hierarchii.

Podczas korzystania z kontrolera nawigacyjnego do wypychania niestandardowego kontrolera widoku na ekranie, self.view.window jest wciąż nil do tego czasu viewDidLoad lub viewWillAppear: jest nazywany. Więc, _textView.window jest również nil w tych samych metodach, ponieważ _textView jest podzbiorem self.view, tj. oba znajdują się w tym samym oknie. Bez względu na to, jak zaprezentujesz swój niestandardowy kontroler widoku, self.view.window (a zatem _textView.window) jest również nil w initWithNibName:bundle:. self.view.window jest ustawiany według czasu viewDidAppear: jest wywoływana, ale jest już za późno, ponieważ do tego czasu kontroler nawigacji ukończył już animację przesuwania widoku na ekranie.

self.view.window jest również ustawiany według czasu viewWillLayoutSubviews lub viewDidLayoutSubviews jest wywoływana i te metody są wywoływane przed rozpoczęciem animacji push sterownika nawigacyjnego. Dlatego właśnie działa, gdy robisz to w jednej z tych metod.

Niestety, viewWillLayoutSubviews i viewDidLayoutSubviews nazywać się o wiele więcej niż tylko początkowym naciśnięciem kontrolera nawigacyjnego. Ale, navigationController:willShowViewController: i willMoveToParentViewController: zostań wezwany zbyt wcześnie (po viewDidLoad ale przedtem self.view.window jest ustawiony) i navigationController:didShowViewController: i didMoveToParentViewController: dzwonić zbyt późno (po animacji push).

Jedyny inny sposób, w jaki mogę to zrobić, to jakoś obserwować window własność _textView aby otrzymywać powiadomienia o zmianach, ale nie wiem, jak to zrobić window jest readonly.


17
2017-10-25 04:03



Pracuje dla mnie! Dzięki! - johnboiles
Od dawna szukam rozwiązania tego problemu. Czy to nowość w systemie iOS 7, czy też go tęskniłem? Świetne rozwiązanie! - SAHM
Działa, ale musisz dodać jakiś mechanizm, aby umożliwić jednorazowe wykonanie tego kodu, ponieważ viewWillLayoutSubviews lub viewDidLayoutSubviews często podczas interakcji z interfejsem użytkownika. - malex
Widoczny jest również efekt uboczny podczas ruchu. Szybkość ruchu kontrolera widoku jest trochę szybsza niż ruch klawiatury (szczególnie po raz pierwszy). Klawiatura próbuje złapać lewą granicę animowanego granicznego widoku. - malex
Zauważyłem, że występuje znaczne opóźnienie przy pierwszym ładowaniu widoku podczas korzystania z tej metody. Masz pomysł, jak rozwiązać ten problem? - stewart715


W iOS 7 (lub dowolnej wersji wcześniej) możesz zrobić prostą rzecz loadView, viewDidLoad lub viewWillAppear

[yourTextView performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];

W tym przypadku pojawi się od lewej do prawej wyglądzie klawiatury zgodnej z ruchem przesuwanego kontrolera widoku.


3
2017-12-17 16:13



Działa to skutecznie tylko na symulatorze iOS. Na prawdziwym urządzeniu jest trochę buggy. - stewart715
To działało dla mnie świetnie, nawet na urządzeniu. Wystąpiły problemy z opisanymi wyżej hakami układu widoków. Czemu? Miałem subviews powodujących zmianę układu, która zmusiłaby pole tekstowe do ponownego udzielenia pierwszej odpowiedzi. Oooo. To rozwiązanie miało również przyjemny efekt przesuwania. Dzięki! - drudru


W przypadku iOS 7 znalazłem następujące rozwiązanie, które działa najlepiej dla mnie:

-Import UIResponder-KeyboardCache do twojego projektu.

-Dodaj [UIResponder cacheKeyboard:YES]; do viewDidLoad widoku przed widokiem klawiatury. Lepiej jest zrobić to natychmiast, gdy aplikacja się ładuje lub w czasie dogodnym, kiedy możesz sobie na nią pozwolić (na przykład w przypadku żądania HTTP). W większości przypadków po prostu w widoku przed jest wystarczająca.

-Dodaj następujące dane do viewDidLoad widoku klawiatury.

dispatch_async(dispatch_get_main_queue(), ^{
  [_textField becomeFirstResponder];
});

Aby to wyjaśnić, zostanie wstępnie załadowany widok klawiatury, który usunie opóźnienie z pierwszego wywołania widoku klawiatury. Powołanie becomeFirstResponder w polu tekstowym w kolejce głównej powoduje przesuwanie się z widokiem zamiast animacji w górę, zanim widok się wślizgnie.


3
2018-02-18 23:51



To kołysze. Wielkie dzięki! Najłatwiejsze rozwiązanie tego problemu, myślę, że twoja kategoria będzie w moim każdym projekcie. Dzięki jeszcze raz! - p4sh4


Możesz spróbować wysłać wiadomość o stanie ZostańFirstResponderem do nowego kontrolera widoku, zanim wepchniesz go na stos. Na przykład:

-(void)functionWhereYouPushTheNewViewController {
  yourNewViewController *newVC = [[yourNewViewController alloc] init];
  [newVC.yourTextView becomeFirstResponder];
  [self.navigationController pushViewController:newVC animated:YES];
}

Odkryłem, że zmiana animacji na takich rzeczach jak klawiatura jest dość trudna, a jeśli czytasz Wskazówki dotyczące interfejsu ludzkiego, Apple jasno pokazuje, że chcą, aby pewne rzeczy działały w określony sposób przez cały czas. Istnieją sposoby zmiany zachowań niektórych animacji, ale często obejmują one nieudokumentowane wywołania interfejsu API i stanowią podstawę do odrzucenia ze sklepu z aplikacjami. Byłoby naruszeniem HIG, aby na przykład popchnąć widoki z dołu.

Mam nadzieję że to pomoże.


0
2017-07-15 21:02



Co dziwne, jeśli wywołasz metodę beFirstResponder przed pushViewController, to nic nie robi. Być może dlatego, że widok nie był jeszcze częścią interfejsu. Wywołanie go po pushViewController powoduje natychmiastowe pojawienie się klawiatury. Jeśli zachowanie klawiatury jest tak trudne, jak mówisz (chociaż Apple robi to w jakiś sposób w aplikacji Kontakty), to może powinienem to zostawić. - T .