Как да разбера дали клавиатурата е показана в момента, ако съм преминал от друг контролер за преглед, който вече показва клавиатурата?

Имам контролер за изглед, който прави UITextField firstResponder на ViewWillAppear. Обикновено мога просто да разчитам на известие на UIKeyboardWillShow, за да открия дали клавиатурата се е показала, но това няма да се задейства, ако вляза в текущия контролер за изглед, докато клавиатурата вече се показва.

Някой има ли идеи?


person Vadoff    schedule 18.09.2015    source източник
comment
in viewWillDisappear просто отхвърлете клавиатурата, като използвате [self.view endEditing:YES]   -  person Venk    schedule 18.09.2015


Отговори (2)


Забелязах, докато отстранявах грешки в йерархията на изгледа, че когато е представена клавиатура, има UIRemoteKeyboardWindow в йерархията.

Първо можем да добавим разширение към UIApplication, за да проверим йерархията на прозореца за UIRemoteKeyboardWindow:

extension UIApplication {
    var isKeyboardPresented: Bool {
        if let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow"), self.windows.contains(where: { $0.isKind(of: keyboardWindowClass) }) {
            return true
        } else {
            return false
        }
    }
}

След това в viewDidLoad или където е необходимо можем да проверим:

if UIApplication.shared.isKeyboardPresented {
   print("Keyboard is presented")
}

Въпреки че този метод не е напълно тестван и UIRemoteKeyboardWindow е в частни заглавки, затова NSClassFromString е необходим за проверка. Използвайте го с грижа!

person Najdan Tomić    schedule 14.07.2017
comment
Това работи в много случаи, освен когато се извиква iOS имейл модал. Анулирането на модала връща клавиатурата, представена true, въпреки че трябва да е false - person Markon; 06.11.2020

Когато въведете textField, той става първи отговор и след това клавиатурата ще се появи на изгледа ви. Можете да проверите състоянието на клавиатурата във вашия viewWillAppear метод [textField isFirstResponder]. Ако върне YES, означава, че клавиатурата ви се вижда.

-(void)viewWillAppear:(BOOL)animated{
     [super viewWillAppear:animated];
     if([textField isFirstResponder]){
       //visible keyboard
     }
}

Редактирано Ако искате височината, можете да съхраните височината на клавиатурата в някаква променлива на класа, когато се появи за първи път и да я използвате в метода viewWillAppear

@implementation YourClass{
    CGFloat keyboardSize;
}

-(void)viewWillAppear:(BOOL)animated{
     [super viewWillAppear:animated];
     if([textField isFirstResponder]){
        //user keyboardSize here
     }
}
person Vineet Choudhary    schedule 18.09.2015
comment
Не е задължително, ако се използва хардуерна клавиатура, софтуерната клавиатура няма да бъде показана. Освен това бих искал действителното известие да се случи, за да мога да намеря действителния размер на клавиатурата на дисплея. - person Vadoff; 18.09.2015