Мне нужно проверить состояние видимости клавиатуры в моем приложении для iOS.
псевдокод:
if(keyboardIsPresentOnWindow) {
//Do action 1
}
else if (keyboardIsNotPresentOnWindow) {
//Do action 2
}
Как я могу проверить это состояние?
ios
objective-c
keyboard
Джитендра Сингх
источник
источник
Ответы:
… Или воспользуйтесь легким путем:
Когда вы вводите текстовое поле, оно становится первым респондентом и появляется клавиатура. Вы можете проверить состояние клавиатуры с помощью
[myTextField isFirstResponder]
. Если он возвращаетсяYES
, значит, клавиатура активна.источник
Код drawonward очень близок, но конфликтует с пространством имен UIKit, и его можно упростить в использовании.
источник
+load
- это специальный метод, вызываемый средой выполнения Objective-C. Он вызывается для каждого класса после загрузки двоичного файла приложения, но доmain()
ввода функции. Нет никакой гарантии, что пул с автоматическим выпуском будет активен.NSAutoreleasePool
alloc
/release
теперь может быть заменен на окружающем код@autoreleasepool { }
Создайте,
UIKeyboardListener
когда вы знаете, что клавиатура не видна, например, позвонив[UIKeyboardListener shared]
изapplicationDidFinishLaunching
.источник
+(void)load
init для этого класса слушателя, чтобы он в общем работал перетаскиванием в любой проект и инициализировался при запуске второго приложения, вместо того, чтобы запоминать его где-нибудь.Я думаю, вам нужно использовать уведомления о клавиатуре:
От: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITextField_Class/Reference/UITextField.html
источник
Реализация Swift 3
источник
Использование иерархии подвидов окон в качестве индикатора для отображения клавиатуры - это хитрость. Если Apple изменит свою базовую реализацию, все эти ответы сломаются.
Правильный способ - отслеживать отображение клавиатуры и скрывать приложение уведомлений, например, внутри вашего делегата приложения:
В AppDelegate.h:
В AppDelegate.m:
Затем вы можете проверить, используя:
Следует отметить, что уведомления о отображении / скрытии клавиатуры не срабатывают, когда пользователь использует Bluetooth или внешнюю клавиатуру.
источник
Добавить расширение
Затем проверьте, присутствует ли клавиатура,
источник
guard let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow") else { return false }; return UIApplication.shared.windows.contains(where: { $0.isKind(of: keyboardWindowClass) })
Это из Руководства по программированию текста iOS, опубликованного Apple здесь: https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html
Обычно вызывайте "registerForKeyBoardNotifications" в вашем ViewDidLoad. Затем каждый раз, когда клавиатура становится активной, вызывается «keyboardWasShown». И каждый раз, когда пропадает клавиатура, вызывается «keyboardWillBeHidden».
источник
Сейчас в iOS8 это решение, конечно, не работает. Первоначально он был написан для IOS4 / 5.
Попробуйте это решение:
источник
Несколько наблюдений:
Рекомендуемый шаблон для одноэлементного объекта будет следующим. dispatch_once гарантирует, что класс инициализируется один раз потокобезопасным способом, а статическая переменная не видна снаружи. И это стандартный GCD, поэтому не нужно знать о низкоуровневых деталях Objective-C.
Обычно вы не хотите знать, видна клавиатура или нет, а знать, насколько она велика. Не все клавиатуры имеют одинаковый размер. Клавиатуры iPhone меньше, чем клавиатуры iPad. Итак, вам нужно другое свойство,
@property (readonly, nonatomic) CGRect keyboardRect;
которое устанавливается в методе noticeShowKeyboard: примерно так:Важно отметить, что прямоугольник находится в координатах UIWindow и не учитывает поворот экрана. Таким образом, вызывающий преобразует этот прямоугольник, вызывая
Если пользователь поворачивает экран, когда клавиатура видна, приложению сообщается, что клавиатура скрыта, а затем отображается снова. Когда он отображается, другие виды, скорее всего, еще не повернуты. Поэтому, если вы сами наблюдаете за событиями скрытия / отображения клавиатуры, конвертируйте координаты, когда они вам действительно нужны, а не в уведомлении.
Если пользователь разделяет или открепляет клавиатуру, или использует аппаратную клавиатуру, в уведомлениях клавиатура всегда будет отображаться как скрытая. Отстыковка или объединение клавиатуры отправит уведомление «отображается клавиатура».
Слушатель должен быть инициализирован, пока клавиатура скрыта, иначе первое уведомление будет пропущено, и будет предполагаться, что клавиатура скрыта, когда это не так.
Поэтому очень важно знать, чего вы действительно хотите. Этот код полезен, чтобы убрать вещи с пути клавиатуры (с разделенной или отсоединенной клавиатурой это ответственность пользователя). Он не сообщает вам, видит ли пользователь клавиатуру на экране (в случае разделенной клавиатуры). Он не сообщает вам, может ли пользователь печатать (например, при наличии аппаратной клавиатуры). Просмотр других окон не работает, если приложение само создает другие окна.
источник
Быстрая реализация:
Поскольку быстро не выполняет класс нагрузку метод при запуске важно запустить эту службу на запуске приложения:
источник
Это мое решение, оно инкапсулирует все в один статический метод, и вы можете вызывать его где угодно, чтобы проверить:
источник
А вот как это сделать в Swift:
Не забудьте отменить регистрацию:
И если вы хотите закрыть клавиатуру при нажатии кнопки «Вернуться»:
источник
Попробуйте эту функцию
}
от: iOS: Как получить доступ к `UIKeyboard`?
источник
BOOL isTxtOpen = [txtfieldObjct isFirstReponder]. Если он возвращает ДА, значит, клавиатура активна.
источник
Чтобы проверить, появилась ли клавиатура погоды, мы можем использовать предустановленные уведомления клавиатуры.
UIKeyboardDidShowNotification, UIKeyboardDidHideNotification
Например, я могу использовать следующий код для прослушивания уведомления клавиатуры
// Слушаем появление и исчезновение клавиатуры
в методах я могу получать уведомления
источник
Swift 4
источник
Вы можете итеративно проверять все текстовые представления, текстовые поля и метки в подпредставлениях родительского представления, чтобы узнать, являются ли они первым респондентом примерно так:
источник
SWIFT 4.2 / SWIFT 5
источник
Я думаю, это может тебе помочь,
Спасибо,
Навин Шан
источник