iPhone. Клавиатура должна отображаться справа, как при редактировании заметки в Контактах. - PullRequest
19 голосов
/ 15 июля 2009

Я ищу способ сдвинуть клавиатуру справа, как в приложении «Контакты» при редактировании заметки.

Моя проблема заключается в том, что когда я вызываю [someTextView intoFirstResponder] в viewWillAppear, клавиатура немедленно появляется без анимации. И когда я вызываю его в viewDidAppear, представление сначала скользит справа (UINavigationController выполняет скольжение), а затем клавиатура скользит снизу.

Можно ли сдвинуть клавиатуру справа вместе с видом?

Ответы [ 5 ]

17 голосов
/ 25 октября 2013

Решение

В iOS 7 вызов becomeFirstResponder на _textView в viewDidLayoutSubviews работает.

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

Примечание. Выполнение этого в viewWillLayoutSubviews также работает.

Объяснение

Прочитайте обсуждение в документации по стать первым респондентом .

Вы можете вызвать этот метод, чтобы сделать объект респондента, такой как представление, первым респондентом. Однако вы должны вызывать его только в этом представлении, если оно является частью иерархии представлений. Если свойство представления window содержит объект UIWindow, оно установлено в иерархии представлений; если возвращается nil, представление отсоединяется от любой иерархии.

При использовании контроллера навигации для вывода на экран пользовательского контроллера представления, self.view.window по-прежнему nil к тому времени, когда вызывается viewDidLoad или viewWillAppear:. Таким образом, _textView.window также является nil в тех же методах, поскольку _textView является подпредставлением self.view, то есть они оба находятся в одном и том же окне. Независимо от того, как вы представляете свой пользовательский контроллер представления, self.view.window (и, следовательно, _textView.window) также nil в initWithNibName:bundle:. self.view.window устанавливается к тому моменту, когда вызывается viewDidAppear:, но это слишком поздно, потому что к этому времени навигационный контроллер уже завершил анимацию вывода вида на экран.

self.view.window также устанавливается к тому времени, когда вызывается viewWillLayoutSubviews или viewDidLayoutSubviews, и эти методы вызываются до того, как начинается анимация нажатия контроллера навигации. Вот почему это работает, когда вы делаете это любым из этих методов.

К сожалению, viewWillLayoutSubviews и viewDidLayoutSubviews вызывают намного больше, чем просто при первом нажатии навигационного контроллера. Но navigationController:willShowViewController: и willMoveToParentViewController: вызывают слишком рано (после viewDidLoad, но до установки self.view.window), а navigationController:didShowViewController: и didMoveToParentViewController: вызывают слишком поздно (после анимации push).

Единственный другой способ, которым я могу думать, это как-то наблюдать свойство window _textView, чтобы вы получали уведомление при его изменении, но я не уверен, как это сделать, поскольку window readonly.

11 голосов
/ 19 июля 2009

Все, что вам нужно сделать, это указать рассматриваемому текстовому представлению стать первым респондентом в методе viewDidLoad контроллера представления, который вы помещаете в стек навигации:

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

Это работает в iOS 8. Клавиатура скользит справа вместе с видом.

3 голосов
/ 19 февраля 2014

Для iOS 7 я нашел следующее решение, которое работает лучше всего для меня:

-Импорт UIResponder-KeyboardCache в ваш проект.

-Добавить [UIResponder cacheKeyboard:YES]; к viewDidLoad вида перед видом клавиатуры. Возможно, лучше сделать это немедленно, когда приложение загружается, или в удобное для вас время, когда вы можете себе это позволить (например, во время HTTP-запроса). В большинстве случаев достаточно простого представления.

-Добавить следующее к viewDidLoad вида клавиатуры.

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

Для пояснения, это предварительно загрузит представление клавиатуры, что удалит задержку от первого вызова представления клавиатуры. Вызов becomeFirstResponder для текстового поля в основной очереди заставляет его скользить вместе с видом, а не анимироваться вверх, прежде чем вид скользит.

3 голосов
/ 17 декабря 2013

В iOS 7 (или любой другой версии) вы можете сделать простую вещь в loadView , viewDidLoad или viewWillAppear

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

В этом случае клавиатура будет отображаться слева направо в соответствии с движением нажатия контроллера вида.

0 голосов
/ 16 июля 2009

Вы можете попытаться отправить сообщение становленияFirstResponder новому контроллеру представления, прежде чем поместить его в стек. Например:

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

Я обнаружил, что изменять анимацию на таких вещах, как клавиатура, довольно сложно, и если вы прочитаете Руководство по интерфейсу пользователя, Apple ясно даст понять, что они хотят, чтобы определенные вещи действовали определенным образом, все время. Существуют способы изменить поведение определенных анимаций, но они часто включают недокументированные вызовы API и являются основанием для отклонения из магазина приложений. Например, было бы нарушением HIG, если бы выдвигаемые виды скользили снизу вверх, например.

Надеюсь, это поможет.

...