Отключить клавиатуру с помощью жеста смахивания (как в приложении "Сообщение")

Когда клавиатура отображается в приложении «Сообщения» iPhone, если пользователь начинает смахивать вниз от табличного представления сообщений и переходит в область клавиатуры, клавиатура начнет отключаться. Если во время этого процесса они будут двигать пальцем вверх и вниз, клавиатура будет двигаться вместе с ним.

Делает ли Apple это с частными API-интерфейсами или есть способ управлять такой клавиатурой из (я полагаю) распознавателя жестов?


person Michael Stet    schedule 20.08.2011    source источник
comment
На моем iPhone этого не происходит. (3GS, iOS 4.3.3)   -  person Mundi    schedule 20.08.2011
comment
Ах, тогда гипотетически это может быть в следующем выпуске ОС. Я хотел бы обсудить, как в принципе можно было получить такой эффект.   -  person Michael Stet    schedule 21.08.2011
comment
Я считаю, что это функция iOS 5.x. К настоящему моменту соглашение о неразглашении информации должно быть прекращено.   -  person Nicolas Miari    schedule 30.01.2012
comment
К сожалению, эта функция до сих пор не появилась в iOS 5.x. Посмотрите мой ответ на попытку с открытым исходным кодом.   -  person Daniel Amitay    schedule 20.02.2012
comment
@DanielAmitay Я нашел отличное решение для iOS 7.1+.   -  person ma11hew28    schedule 30.06.2014


Ответы (8)


Я создал категорию UIView, которая обеспечивает желаемую функциональность:

https://github.com/danielamitay/DAKeyboardControl

Изменить: он действительно использовался в магазине приложений.

person Daniel Amitay    schedule 19.02.2012
comment
просто потрясающе! (кто-то должен принять это как ответ) - person Filipe Pina; 21.03.2012
comment
отлично, у вас должно быть более 10 голосов за эту вещь! - person john.k.doe; 30.11.2012
comment
ааа и в iOS 8 он сломан. Думаю, всем пора найти новое решение! - person chris stamper; 13.06.2014
comment
В этом swizzled_addSubview бывают сбои. Даже не знаю, как происходит сбой - person Itesh; 19.11.2014
comment
@ CanPoyrazoğlu Можете найти решение? Я сталкиваюсь с тем же - person Prashant Tukadiya; 04.05.2017
comment
@MikeAlter нет, я отказался от этого. - person Can Poyrazoğlu; 05.05.2017
comment
Хорошо @ CanPoyrazoğlu, если вы все еще ищете ответ, см. Решение mattdipasquale, оно работает, - person Prashant Tukadiya; 05.05.2017

Самое простое решение - установить следующие два свойства:

Бум, детка!

Ознакомьтесь с Acani Chats iPhone Client ChatViewController.swift в качестве примера.

person ma11hew28    schedule 23.06.2014
comment
Это должен быть принятый ответ. После iOS 7 все, что вам нужно, это keyboardDismissMode. - person Bill; 16.11.2014
comment
У меня есть UIView, который содержит textField. Как я могу это сделать? - person Gaby Fitcal; 13.01.2016
comment
@GabyFitcal. Это нормально. Прочтите все ссылки выше. Я их обновил. - person ma11hew28; 14.01.2016
comment
tableView.keyboardDismissMode = .OnDrag - person Włodzimierz Woźniak; 11.08.2016

К счастью, Apple добавила удобное свойство keyboardDismissMode на UIScrollView, чтобы облегчить вам жизнь.

Теперь ваше приложение может вести себя как Messages.app, просто изменив одно свойство в раскадровке или, как вариант, добавив одну строку кода!

Это свойство использует новое перечисление UIScrollViewKeyboardDismissMode. Возможные значения этого перечисления следующие:

UIScrollViewKeyboardDismissModeNone        // the keyboard is not dismissed    automatically when scrolling
UIScrollViewKeyboardDismissModeOnDrag      // dismisses the keyboard when a drag begins
UIScrollViewKeyboardDismissModeInteractive // the keyboard follows the dragging touch off screen, and may be pulled upward again to cancel the dismiss

Вот свойство Storyboard, которое нужно изменить, чтобы убрать клавиатуру при прокрутке:

введите описание изображения здесь

Надеюсь, что это поможет решить вашу проблему

person Miguel Carvajal    schedule 23.01.2016
comment
Отлично. Возбужден, мне нечего делать, кроме как поставить галочку. Затем я понял, что мое представление ввода, прикрепленное к верхней части моей клавиатуры, не двигалось вместе с ним ... ох. - person bandejapaisa; 12.02.2017

В iOS 7 теперь вы можете отключить клавиатуру в интерактивном режиме в UIScrollView.

Отключение клавиатуры в UIScrollView

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

person Jeremy Massel    schedule 29.11.2013
comment
В моем ответе ниже содержится более подробная информация без ссылки, которая может быть изменена в будущем. - person Miguel Carvajal; 07.04.2016

Для этого вы можете использовать UISwipeGestureRecognizer. Я не знаю, как реализовать это с помощью кода, но если вы используете новую бета-версию xcode 4.2, то есть простой способ:

  1. Создайте IBAction:

- (IBAction)dismiss:(id)sender;

  1. Перейдите к вашему представлению в xib и установите класс для вашего представления на UIControl.

  2. Перетащите и подключите UISwipeGestureRecognizer из библиотеки к вашему представлению.

  3. Подключите IBAction (TouchDown) к UISwipeGestureRecognizer.

  4. Напишите код, чтобы закрыть клавиатуру:

    - (IBAction)dismiss:(id)sender 
    
    {
    
      [yourTextField resignFirstResponder];
    
    }
    

Выполнено!

person JonasG    schedule 20.08.2011
comment
Это не сработает. Клавиатура соскользнет вниз и исчезнет, ​​но не вернется, когда палец снова поднимется до завершения жеста. - person Mundi; 21.08.2011
comment
Что ж, это единственный известный мне способ закрыть клавиатуру жестом смахивания. Просто хотел помочь! - person JonasG; 21.08.2011
comment
согласен с JonasG. в то время как Apple, вероятно, использует форму UIPanGestureRecognizer под капотом, для этого требуется их собственное внутреннее знание управления рамкой клавиатуры, чтобы заставить ее скользить вверх и вниз так, как вы видите в Messages.app. ближе всего было бы использовать UISwipeGestureRecognizer (или, возможно, UIPanGestureRecognizer, хотя он будет действовать практически так же, как смахивание, в том смысле, что вниз запустит движение, и не будет возможности остановить исчезновение клавиатуры в этот момент). - person john.k.doe; 30.11.2012

В swift вы можете использовать приведенный ниже код, чтобы получить контейнер представления текущей клавиатуры (если существует), чем вы можете изменить его рамку в своем коде:

UIApplication.shared.windows
    .filter{ NSStringFromClass($0.classForCoder) == "UIRemoteKeyboardWindow" }
    .first?.subviews.filter { NSStringFromClass($0.classForCoder) == "UIInputSetContainerView" }
    .first?.subviews.filter { NSStringFromClass($0.classForCoder) == "UIInputSetHostView" }
    .first

Кстати, вот инструмент под названием Reveal, позволяющий увидеть иерархическое представление.

person mangonob    schedule 20.04.2017

Я думаю, что лучший способ - разместить скрытую кнопку над контейнером для ввода текста. длинная полоса, и когда он обнаруживает касание и отпускает или отменяет, затем скрывает клавиатуру.

Я собираюсь попробовать, и я дам вам знать, как я иду.

person Bassem    schedule 29.09.2011

Короткий ответ; Скорее всего, они там занимаются каким-то «частным API».

Я абсолютно уверен, что клавиатура находится в независимом представлении, над окном вашего приложения (у вас нет доступа к ней или управления ею, и она всегда отображается сверху, несмотря ни на что). Максимум, что вы можете сделать, это сделать так, чтобы представление ввода стало / отказалось от статуса первого респондента, и клавиатура будет отображаться / исчезать соответственно: все или ничего.

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

person Nicolas Miari    schedule 29.09.2011