Как я могу программно проверить, присутствует ли клавиатура в приложении iOS?

111

Мне нужно проверить состояние видимости клавиатуры в моем приложении для iOS.

псевдокод:

if(keyboardIsPresentOnWindow) {
    //Do action 1
}
else if (keyboardIsNotPresentOnWindow) {
    //Do action 2
}

Как я могу проверить это состояние?

Джитендра Сингх
источник
Какое приложение? Какой язык? Какая платформа? Мое лучшее предположение - iPhone?
Ник Бедфорд,
4
Вопрос исправлен. Пусть игры начнутся!
Роберт Харви,
Возможно это
Питер Вонг

Ответы:

68

… Или воспользуйтесь легким путем:

Когда вы вводите текстовое поле, оно становится первым респондентом и появляется клавиатура. Вы можете проверить состояние клавиатуры с помощью [myTextField isFirstResponder]. Если он возвращается YES, значит, клавиатура активна.

thpitsch
источник
21
Хорошее решение, однако это НЕ сработает, если используется аппаратная клавиатура (обычное дело для iPad).
Андрей Херфорд
4
Это не отвечает на вопрос. Это говорит вам, является ли текстовое поле первым респондентом. У меня есть контроллер представления с несколькими контроллерами дочерних представлений, каждый из которых содержит UITextFields. Используя этот метод, я не могу сказать от моего родительского контроллера представления, отображается ли клавиатура. Единственный надежный способ - использовать метод уведомления, описанный в других ответах
TimWhiting
63

Код drawonward очень близок, но конфликтует с пространством имен UIKit, и его можно упростить в использовании.

@interface KeyboardStateListener : NSObject {
    BOOL _isVisible;
}
+ (KeyboardStateListener *)sharedInstance;
@property (nonatomic, readonly, getter=isVisible) BOOL visible;
@end

static KeyboardStateListener *sharedInstance;

@implementation KeyboardStateListener

+ (KeyboardStateListener *)sharedInstance
{
    return sharedInstance;
}

+ (void)load
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    sharedInstance = [[self alloc] init];
    [pool release];
}

- (BOOL)isVisible
{
    return _isVisible;
}

- (void)didShow
{
    _isVisible = YES;
}

- (void)didHide
{
    _isVisible = NO;
}

- (id)init
{
    if ((self = [super init])) {
        NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
        [center addObserver:self selector:@selector(didShow) name:UIKeyboardDidShowNotification object:nil];
        [center addObserver:self selector:@selector(didHide) name:UIKeyboardWillHideNotification object:nil];
    }
    return self;
}

@end
rpetrich
источник
4
Зачем ему собственный бассейн?
Дэн Розенстарк 01
18
+load- это специальный метод, вызываемый средой выполнения Objective-C. Он вызывается для каждого класса после загрузки двоичного файла приложения, но до main()ввода функции. Нет никакой гарантии, что пул с автоматическим выпуском будет активен.
rpetrich 02
1
MattDiPasquale: если метод + load удален, sharedInstance никогда не будет инициализирован. Поскольку нет гарантии, что пул автозапуска активен, когда среда выполнения вызывает метод + load, необходимо обернуть все вызовы классов, предоставляемых системой, в случае, если они вызывают autorelease.
rpetrich
3
Хороший ответ! Я знаю , что это несколько лет , но NSAutoreleasePool alloc/ releaseтеперь может быть заменен на окружающем код@autoreleasepool { }
Чаун
3
Не забудьте удалить Observer, возможно, в dealloc KeyboardStateListener.
SushiGrass Jacob
32

Создайте, UIKeyboardListenerкогда вы знаете, что клавиатура не видна, например, позвонив [UIKeyboardListener shared]из applicationDidFinishLaunching.

@implementation UIKeyboardListener

+ (UIKeyboardListener) shared {
    static UIKeyboardListener sListener;    
    if ( nil == sListener ) sListener = [[UIKeyboardListener alloc] init];

    return sListener;
}

-(id) init {
    self = [super init];

    if ( self ) {
        NSNotificationCenter        *center = [NSNotificationCenter defaultCenter];
        [center addObserver:self selector:@selector(noticeShowKeyboard:) name:UIKeyboardDidShowNotification object:nil];
        [center addObserver:self selector:@selector(noticeHideKeyboard:) name:UIKeyboardWillHideNotification object:nil];
    }

    return self;
}

-(void) noticeShowKeyboard:(NSNotification *)inNotification {
    _visible = true;
}

-(void) noticeHideKeyboard:(NSNotification *)inNotification {
    _visible = false;
}

-(BOOL) isVisible {
    return _visible;
}

@end
KlimczakM
источник
Примечание. Вы можете использовать +(void)loadinit для этого класса слушателя, чтобы он в общем работал перетаскиванием в любой проект и инициализировался при запуске второго приложения, вместо того, чтобы запоминать его где-нибудь.
Альберт Реншоу
30

Я думаю, вам нужно использовать уведомления о клавиатуре:

От: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITextField_Class/Reference/UITextField.html

Уведомления с клавиатуры

Когда система показывает или скрывает клавиатуру, она отправляет несколько уведомлений с клавиатуры. Эти уведомления содержат информацию о клавиатуре, включая ее размер, которую вы можете использовать для вычислений, связанных с движущимися представлениями. Регистрация для получения этих уведомлений - единственный способ получить некоторые типы информации о клавиатуре. Система доставляет следующие уведомления о событиях, связанных с клавиатурой:

* UIKeyboardWillShowNotification
* UIKeyboardDidShowNotification
* UIKeyboardWillHideNotification
* UIKeyboardDidHideNotification

Дополнительные сведения об этих уведомлениях см. В их описании в справочнике по классам UIWindow. Для получения информации о том, как показать и скрыть клавиатуру, см. Текст и Интернет.

попрошайки
источник
Я проверил это уведомление, но не знаю, как проверить эти уведомления. Если бы вы могли опубликовать какой-нибудь пример, это было бы очень полезно.
Джитендра Сингх,
2
Взгляните на NSNotificationCenter. Вам нужно будет зарегистрироваться для получения интересующих вас уведомлений. Не забудьте отменить регистрацию при выходе из приложения.
Томас Мюллер
13

Реализация Swift 3

    import Foundation
class KeyboardStateListener: NSObject
{
    static let shared = KeyboardStateListener()
    var isVisible = false

    func start() {
        NotificationCenter.default.addObserver(self, selector: #selector(didShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(didHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }

    func didShow()
    {
        isVisible = true
    }

    func didHide()
    {
        isVisible = false
    } 
}
Христос Чаджикириаку
источник
1
Я рекомендую удалить наблюдателя в деините, или если его контроллер представления исчезнет,
Хуан Боэро
3
Нет смысла использовать деиницирование, если это синглтон, потому что он никогда не будет деинициализирован
Sirens
11

Использование иерархии подвидов окон в качестве индикатора для отображения клавиатуры - это хитрость. Если Apple изменит свою базовую реализацию, все эти ответы сломаются.

Правильный способ - отслеживать отображение клавиатуры и скрывать приложение уведомлений, например, внутри вашего делегата приложения:

В AppDelegate.h:

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (assign, nonatomic) BOOL keyboardIsShowing;

@end

В AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    // Monitor keyboard status application wide
    self.keyboardIsShowing = NO;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:)
                                             name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:)
                                             name:UIKeyboardWillHideNotification object:nil];

    return YES;
}

- (void)keyboardWillShow:(NSNotification*)aNotification
{
    self.keyboardIsShowing = YES;
}

- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    self.keyboardIsShowing = NO;
}

Затем вы можете проверить, используя:

BOOL keyboardIsShowing = ((AppDelegate*)[UIApplication sharedApplication].delegate).keyboardIsShowing;

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

Влад
источник
10

Добавить расширение

extension UIApplication {
    /// Checks if view hierarchy of application contains `UIRemoteKeyboardWindow` if it does, keyboard is presented
    var isKeyboardPresented: Bool {
        if let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow"),
            self.windows.contains(where: { $0.isKind(of: keyboardWindowClass) }) {
            return true
        } else {
            return false
        }
    }
}

Затем проверьте, присутствует ли клавиатура,

if UIApplication.shared.isKeyboardPresented {
     print("Keyboard presented")
} else { 
     print("Keyboard is not presented")
}
Кей Си
источник
Можетguard let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow") else { return false }; return UIApplication.shared.windows.contains(where: { $0.isKind(of: keyboardWindowClass) })
Клэй Бриджес
5

Это из Руководства по программированию текста iOS, опубликованного Apple здесь: https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html

Обычно вызывайте "registerForKeyBoardNotifications" в вашем ViewDidLoad. Затем каждый раз, когда клавиатура становится активной, вызывается «keyboardWasShown». И каждый раз, когда пропадает клавиатура, вызывается «keyboardWillBeHidden».

// Call this method somewhere in your view controller setup code.
- (void)registerForKeyboardNotifications {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil];
}

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification {
    NSLog(@"Keyboard is active.");
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;

    // If active text field is hidden by keyboard, scroll it so it's visible
    // Your app might not need or want this behavior.
    CGRect aRect = self.view.frame;
    aRect.size.height -= kbSize.height;
    if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
        [self.scrollView scrollRectToVisible:activeField.frame animated:YES];
    }
}

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification {
    NSLog(@"Keyboard is hidden");
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;
}
люк
источник
5

Сейчас в iOS8 это решение, конечно, не работает. Первоначально он был написан для IOS4 / 5.

Попробуйте это решение:

- (BOOL) isKeyboardOnScreen 
{
    BOOL isKeyboardShown = NO;

    NSArray *windows = [UIApplication sharedApplication].windows;
    if (windows.count > 1) {
        NSArray *wSubviews =  [windows[1]  subviews];
        if (wSubviews.count) {
            CGRect keyboardFrame = [wSubviews[0] frame];
            CGRect screenFrame = [windows[1] frame];
            if (keyboardFrame.origin.y+keyboardFrame.size.height == screenFrame.size.height) {
                isKeyboardShown = YES;
            }
        }
    }

    return isKeyboardShown;
}
Malex
источник
2
Недопустимо предполагать, что несколько окон подразумевают клавиатуру, и что клавиатура всегда является вторым элементом.
jmah 08
1
@jmah Конечно, это не универсальный подход, но он охватывает огромное количество приложений. Любая попытка получить информацию о клавиатуре использует определенную иерархию представлений, потому что Apple не предоставляет никакого полезного API для этого случая.
malex 08
Это не работает, то, что сработало для меня, было перебирать все представления и для всех UITextFields или UITextView проверять, являются ли они первыми респондентами ... если какой-либо из них возвращает истинную клавиатуру, видна, иначе это не так
amd
4

Несколько наблюдений:

Рекомендуемый шаблон для одноэлементного объекта будет следующим. dispatch_once гарантирует, что класс инициализируется один раз потокобезопасным способом, а статическая переменная не видна снаружи. И это стандартный GCD, поэтому не нужно знать о низкоуровневых деталях Objective-C.

+ (KeyboardStateListener *)sharedInstance
{
    static KeyboardStateListener* shared;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shared = [[KeyboardStateListener alloc] init];
        // Other initialisations
    });

    return shared;
}

Обычно вы не хотите знать, видна клавиатура или нет, а знать, насколько она велика. Не все клавиатуры имеют одинаковый размер. Клавиатуры iPhone меньше, чем клавиатуры iPad. Итак, вам нужно другое свойство, @property (readonly, nonatomic) CGRect keyboardRect;которое устанавливается в методе noticeShowKeyboard: примерно так:

NSValue* value = notification.userInfo [UIKeyboardFrameEndUserInfoKey];
_keyboardRect = value.CGRectValue;

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

KeyboardStateListener* listener = [KeyboardStateListener sharedInstance];
CGRect windowRect = listener.keyboardRect;
CGRect viewRect = [myView convertRect:windowRect fromView:self.window];

Если пользователь поворачивает экран, когда клавиатура видна, приложению сообщается, что клавиатура скрыта, а затем отображается снова. Когда он отображается, другие виды, скорее всего, еще не повернуты. Поэтому, если вы сами наблюдаете за событиями скрытия / отображения клавиатуры, конвертируйте координаты, когда они вам действительно нужны, а не в уведомлении.

Если пользователь разделяет или открепляет клавиатуру, или использует аппаратную клавиатуру, в уведомлениях клавиатура всегда будет отображаться как скрытая. Отстыковка или объединение клавиатуры отправит уведомление «отображается клавиатура».

Слушатель должен быть инициализирован, пока клавиатура скрыта, иначе первое уведомление будет пропущено, и будет предполагаться, что клавиатура скрыта, когда это не так.

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

Крис
источник
Хорошие предупреждения о клавиатуре в iPad, спасибо!
JOM
3

Быстрая реализация:

class KeyboardStateListener: NSObject
{
  static var shared = KeyboardStateListener()
  var isVisible = false

  func start() {
    let nc = NSNotificationCenter.defaultCenter()
    nc.addObserver(self, selector: #selector(didShow), name: UIKeyboardDidShowNotification, object: nil)
    nc.addObserver(self, selector: #selector(didHide), name: UIKeyboardDidHideNotification, object: nil)
  }

  func didShow()
  {
    isVisible = true
  }

  func didHide()
  {
    isVisible = false
  } 
}

Поскольку быстро не выполняет класс нагрузку метод при запуске важно запустить эту службу на запуске приложения:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool
{
  ...    
  KeyboardStateListener.shared.start() 
}
Prcela
источник
Используя iOS 13, swift 5.0, этот последний бит, загрузка класса не нужна?
user3069232 07
3

Это мое решение, оно инкапсулирует все в один статический метод, и вы можете вызывать его где угодно, чтобы проверить:

+(BOOL)isKeyboardVisible{
    static id tokenKeyboardWillShow = nil;
    static id tokenKeyboardWillHide = nil;
    static BOOL isKbVisible = NO;
    @synchronized (self) {
        if (tokenKeyboardWillShow == nil){
            tokenKeyboardWillShow = [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
                @synchronized (self) {
                    isKbVisible = YES;
                }
            }];
        }

        if (tokenKeyboardWillHide == nil){
            tokenKeyboardWillHide = [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillHideNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
                @synchronized (self) {
                    isKbVisible = NO;
                }
            }];
        }
    }

    return isKbVisible;
}
Рпор
источник
2

А вот как это сделать в Swift:

 func registerForKeyboardNotifications() {
    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: "keyboardWasShown:",
        name: UIKeyboardDidShowNotification,
        object: nil)

    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: "keyboardWillBeHidden:",
        name: UIKeyboardWillHideNotification,
        object: nil)
}

func keyboardWasShown(notification: NSNotification) {
    println("Keyboard was shown");
}

func keyboardWillBeHidden(notification: NSNotification) {
    println("Keyboard was dismissed");
}

Не забудьте отменить регистрацию:

 override func viewWillDisappear(animated: Bool) {
    NSNotificationCenter.defaultCenter().removeObserver(self,
        name: UIKeyboardDidShowNotification,
        object: nil)

    NSNotificationCenter.defaultCenter().removeObserver(self,
        name: UIKeyboardWillHideNotification,
        object: nil)
}

И если вы хотите закрыть клавиатуру при нажатии кнопки «Вернуться»:

class ViewController: UIViewController, UITextFieldDelegate {

@IBOutlet weak var yourTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    registerForKeyboardNotifications()
    yourTextField.delegate = self
}

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    self.view.endEditing(true);
    return false;
}

}
Теодор Чурару
источник
1

Попробуйте эту функцию

BOOL UIKeyboardIsVisible(){

BOOL keyboardVisible=NO;
// Locate non-UIWindow.
UIWindow *keyboardWindow = nil;
for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) {
    if (![[testWindow class] isEqual:[UIWindow class]]) {
        keyboardWindow = testWindow;
        break;
    }
}
// Locate UIKeyboard.
for (UIView *possibleKeyboard in [keyboardWindow subviews]) {
    // iOS 4 sticks the UIKeyboard inside a UIPeripheralHostView.
    if ([[possibleKeyboard description] hasPrefix:@"<UIPeripheralHostView"]) {
        keyboardVisible=YES;
    }
    if ([[possibleKeyboard description] hasPrefix:@"<UIKeyboard"]) {
        keyboardVisible=YES;
        break;
    }
}
return keyboardVisible;

}

от: iOS: Как получить доступ к `UIKeyboard`?

Авангард
источник
1

BOOL isTxtOpen = [txtfieldObjct isFirstReponder]. Если он возвращает ДА, значит, клавиатура активна.

Хардик Мамтора
источник
1

Чтобы проверить, появилась ли клавиатура погоды, мы можем использовать предустановленные уведомления клавиатуры.

UIKeyboardDidShowNotification, UIKeyboardDidHideNotification

Например, я могу использовать следующий код для прослушивания уведомления клавиатуры

// Слушаем появление и исчезновение клавиатуры

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardDidShow:)
                                             name:UIKeyboardDidShowNotification
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardDidHide:)
                                             name:UIKeyboardDidHideNotification
                                           object:nil];

в методах я могу получать уведомления

- (void)keyboardDidShow: (NSNotification *) notifyKeyBoardShow{
    // key board is closed
}

- (void)keyboardDidHide: (NSNotification *) notifyKeyBoardHide{
    // key board is opened
}
Манодж Сингхал
источник
1

Swift 4

extension UIViewController {
    func registerKeyboardNotifications() {
        let center = NotificationCenter.default
        center.addObserver(self, selector: #selector(keyboardWillBeShown(note:)), name: Notification.Name.UIKeyboardWillShow, object: nil)
        center.addObserver(self, selector: #selector(keyboardWillBeHidden(note:)), name: Notification.Name.UIKeyboardWillHide, object: nil)
    }

    func removeKeyboardNotifications() {
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)

    }

    @objc
    func keyboardWillBeShown(note: Notification) {}

    @objc
    func keyboardWillBeHidden(note: Notification) {}

}

final class MyViewController: UIViewController {

    // MARK: - Properties
    var isKeyboardVisible = false

    // MARK: - Life Cycle
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        registerKeyboardNotifications()
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        removeKeyboardNotifications()
    }

    // MARK: - Keyboard Handling
    override func keyboardWillBeShown(note: Notification) {
        isKeyboardVisible = true
        let userInfo = note.userInfo
        let keyboardFrame = userInfo?[UIKeyboardFrameEndUserInfoKey] as! CGRect
        let contentInset = UIEdgeInsetsMake(0.0, 0.0, keyboardFrame.height, 0.0)
        tableView.contentInset = contentInset
    }

   override func keyboardWillBeHidden(note: Notification) {
        tableView.contentInset = .zero
        isKeyboardVisible = false
   }

   // MARK: - Test
   fileprivate func test() {
        if isKeyboardVisible { // do something
        }
   }
}
Янтарь К
источник
У меня работает очень хорошо (Xcode 10.2, Swift4), просто любопытно, почему никто не поддержал это?
infinity_coding7
Нет, это не работает, если клавиатура уже была представлена ​​предыдущим контроллером представления.
Ricardo
0

Вы можете итеративно проверять все текстовые представления, текстовые поля и метки в подпредставлениях родительского представления, чтобы узнать, являются ли они первым респондентом примерно так:

-(BOOL)isKeyboardActiveInView:(UIView *)view {
    for (UIView *anyView in [view subviews]) {
        if ([anyView isKindOfClass:[UITextField class]]) {
            if (((UITextField *)anyView).isFirstResponder) {
                return YES;
            }
        } else if ([anyView isKindOfClass:[UILabel class]]) {
            if (((UILabel *)anyView).isFirstResponder) {
                return YES;
            }
        } else if ([anyView isKindOfClass:[UITextView class]]) {
            if (((UITextView *)anyView).isFirstResponder) {
                return YES;
            }
        } else {
            if ([self isKeyboardActiveInView:anyView]) {
                return YES;
            }
        }
    }
    return NO;
}
Альберт Реншоу
источник
Это не сработает, если у вас есть дочерние контроллеры представления
Рикардо
-1

SWIFT 4.2 / SWIFT 5

class Listener {
   public static let shared = Listener()
   var isVisible = false

   // Start this listener if you want to present the toast above the keyboard.
   public func startKeyboardListener() {
      NotificationCenter.default.addObserver(self, selector: #selector(didShow), name: UIResponder.keyboardWillShowNotification, object: nil)
      NotificationCenter.default.addObserver(self, selector: #selector(didHide), name: UIResponder.keyboardWillHideNotification, object: nil)
   }

   @objc func didShow() {
     isVisible = true
   }

    @objc func didHide(){
       isVisible = false
    }
}
Амрит Сидху
источник
-5

Я думаю, это может тебе помочь,

+(BOOL)isKeyBoardInDisplay  {

    BOOL isExists = NO;
    for (UIWindow *keyboardWindow in [[UIApplication sharedApplication] windows])   {
        if ([[keyboardWindow description] hasPrefix:@"<UITextEffectsWindow"] == YES) {
            isExists = YES;
        }  
    }

    return isExists;
}

Спасибо,

Навин Шан

Навин Шан
источник
1
На iOS 6 только работает! После того, как клавиатура была показана один раз, она перестает работать.
Джеймс Лоренстин