Bagaimana saya bisa secara terprogram memeriksa apakah keyboard ada di aplikasi iOS?

111

Saya perlu memeriksa kondisi visibilitas keyboard di aplikasi iOS saya.

Pseudocode:

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

Bagaimana cara memeriksa kondisi ini?

Jitendra Singh
sumber
Aplikasi apa? Bahasa apa? Platform apa? Tebakan terbaik saya adalah iPhone?
Nick Bedford
4
Pertanyaan diperbaiki. Biarkan permainan dimulai!
Robert Harvey
Mungkin ini
Peter Wong

Jawaban:

68

… Atau ambil cara mudahnya:

Saat Anda memasukkan textField, itu menjadi responder pertama dan keyboard muncul. Anda dapat memeriksa status keyboard dengan [myTextField isFirstResponder]. Jika kembali YES, maka keyboard aktif.

thpitsch
sumber
21
Solusi yang bagus, namun ini TIDAK akan berfungsi, jika keyboard perangkat keras digunakan (tidak biasa di iPad).
Andrei Herford
4
Ini tidak menjawab pertanyaan itu. Ini memberi tahu Anda jika bidang teks adalah responden pertama. Saya memiliki pengontrol tampilan dengan beberapa pengontrol tampilan anak, yang semuanya berisi UITextFields. Dengan menggunakan metode ini, saya tidak dapat mengetahui dari pengontrol tampilan orang tua saya apakah keyboard ditampilkan. Satu-satunya cara yang dapat diandalkan adalah dengan menggunakan metode pemberitahuan yang dijelaskan dalam jawaban lain
TimWhiting
63

kode drawonward sangat dekat, tetapi bertabrakan dengan namespace UIKit dan dapat dibuat lebih mudah untuk digunakan.

@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.dll
sumber
4
Mengapa perlu kolam sendiri?
Dan Rosenstark
18
+loadadalah metode khusus yang disebut runtime Objective-C. Ini dipanggil untuk setiap kelas setelah biner aplikasi dimuat, tetapi sebelum main()fungsi dimasukkan. Tidak ada jaminan bahwa kumpulan rilis otomatis akan ditayangkan.
rpetrich
1
MattDiPasquale: Jika metode + load dihapus, sharedInstance tidak akan pernah diinisialisasi. Karena tidak ada jaminan bahwa kumpulan rilis otomatis aktif saat waktu proses memanggil metode beban +, menggabungkan semua panggilan ke kelas yang disediakan sistem diperlukan jika panggilan tersebut disebut rilis otomatis.
rpetrich
3
Jawaban bagus! Saya tahu ini sudah beberapa tahun tetapi NSAutoreleasePool alloc/ releasesekarang dapat diganti dengan mengelilingi kode di@autoreleasepool { }
chown
3
Jangan lupa untuk menghapus Observer, mungkin di dealloc KeyboardStateListener.
SushiGrass Jacob
32

Buat UIKeyboardListenerketika Anda tahu keyboard tidak terlihat, misalnya dengan menelepon [UIKeyboardListener shared]dari 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
sumber
Catatan: Anda dapat menggunakan +(void)loaduntuk memanggil init pada kelas pemroses ini sehingga secara umum akan berfungsi sebagai seret-dan-lepas ke dalam proyek apa pun dan menginisialisasi dari peluncuran aplikasi kedua daripada Anda harus ingat untuk memasukkannya di mana saja.
Albert Renshaw
30

Saya rasa Anda perlu menggunakan pemberitahuan yang disediakan tentang keyboard:

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

Pemberitahuan Keyboard

Saat sistem menampilkan atau menyembunyikan keyboard, beberapa notifikasi keyboard akan diposting. Pemberitahuan ini berisi informasi tentang keyboard, termasuk ukurannya, yang dapat Anda gunakan untuk penghitungan yang melibatkan tampilan bergerak. Mendaftarkan notifikasi ini adalah satu-satunya cara untuk mendapatkan beberapa jenis informasi tentang keyboard. Sistem mengirimkan pemberitahuan berikut untuk acara terkait keyboard:

* UIKeyboardWillShowNotification
* UIKeyboardDidShowNotification
* UIKeyboardWillHideNotification
* UIKeyboardDidHideNotification

Untuk informasi lebih lanjut tentang notifikasi ini, lihat deskripsinya di Referensi Kelas UIWindow. Untuk informasi tentang cara menampilkan dan menyembunyikan keyboard, lihat Teks dan Web.

beggs
sumber
Saya sudah memeriksa pemberitahuan ini, tetapi tidak tahu cara memeriksa pemberitahuan ini. Jika Anda dapat memposting beberapa contoh, itu akan sangat membantu.
Jitendra Singh
2
Lihat NSNotificationCenter. Anda harus mendaftar untuk mendapatkan pemberitahuan yang Anda minati. Jangan lupa untuk membatalkan pendaftaran ketika aplikasi Anda keluar.
Thomas Müller
13

Implementasi 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
    } 
}
Christos Chadjikyriacou
sumber
1
Saya sarankan untuk menghapus pengamat di deinit atau jika pengontrol tampilan dalam tampilan akan hilang
Juan Boero
3
Tidak ada gunanya menggunakan deinit jika ini tunggal karena tidak akan pernah menjadi deinit
Sirene
11

Menggunakan hierarki subview jendela sebagai indikasi untuk menampilkan keyboard adalah hack. Jika Apple mengubah implementasi yang mendasarinya, semua jawaban ini akan rusak.

Cara yang benar adalah dengan memantau tampilan Keyboard dan menyembunyikan aplikasi notifikasi secara luas seperti di dalam Delegasi Aplikasi Anda:

Di AppDelegate.h:

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (assign, nonatomic) BOOL keyboardIsShowing;

@end

Di 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;
}

Kemudian Anda dapat memeriksa menggunakan:

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

Perlu dicatat bahwa notifikasi tampilkan / sembunyikan keyboard tidak akan menyala saat pengguna menggunakan bluetooth atau keyboard eksternal.

Vlad
sumber
10

Tambahkan ekstensi

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
        }
    }
}

Kemudian periksa apakah keyboard ada,

if UIApplication.shared.isKeyboardPresented {
     print("Keyboard presented")
} else { 
     print("Keyboard is not presented")
}
Kay Cee
sumber
Bisa lakukanguard let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow") else { return false }; return UIApplication.shared.windows.contains(where: { $0.isKind(of: keyboardWindowClass) })
Clay Bridges
5

Ini dari Panduan Pemrograman Teks iOS yang diterbitkan oleh Apple di sini: https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html

Pada dasarnya panggil "registerForKeyBoardNotifications" di ViewDidLoad Anda. Kemudian setiap kali keyboard menjadi aktif, "keyboardWasShown" dipanggil. Dan setiap kali keyboard menghilang, "keyboardWillBeHidden" dipanggil.

// 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;
}
Membatalkan
sumber
5

Sekarang di iOS8 solusi ini tentu saja tidak berfungsi. Itu awalnya ditulis untuk IOS4 / 5.

Coba solusi ini:

- (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
sumber
2
Tidak valid untuk mengasumsikan bahwa beberapa jendela menyiratkan keyboard, dan keyboard selalu merupakan elemen kedua.
jmah
1
@jmah Tentu saja ini bukan pendekatan universal tetapi mencakup sejumlah besar kasus aplikasi. Setiap upaya untuk mendapatkan info tentang keyboard menggunakan beberapa hierarki tampilan tertentu karena Apple tidak menyediakan API yang berguna untuk kasus ini.
malex
Ini tidak berfungsi, apa yang berhasil untuk saya adalah iterasi melalui semua tampilan dan untuk semua UITextFields atau UITextView periksa apakah mereka adalah responden pertama ... jika salah satu dari kemudian kembali keyboard yang benar terlihat selain itu tidak
amd
4

Beberapa pengamatan:

Pola yang direkomendasikan untuk objek tunggal adalah sebagai berikut. dispatch_once memastikan kelas diinisialisasi satu kali dengan cara yang aman bagi thread, dan variabel statis tidak terlihat di luar. Dan itu adalah GCD standar, jadi tidak perlu tahu tentang detail level rendah Objective-C.

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

    return shared;
}

Biasanya Anda tidak ingin tahu hanya apakah keyboard itu terlihat atau tidak, tetapi seberapa besar ukurannya. Keyboard tidak semuanya memiliki ukuran yang sama. Papan tombol iPhone lebih kecil dari papan ketik iPad. Jadi Anda ingin properti lain @property (readonly, nonatomic) CGRect keyboardRect;yang disetel dalam metode noticeShowKeyboard: seperti ini:

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

Penting untuk diperhatikan bahwa persegi panjang berada dalam koordinat UIWindow dan tidak memperhatikan rotasi layar. Jadi penelepon akan mengubah persegi panjang itu dengan menelepon

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

Jika pengguna memutar layar saat keyboard terlihat, aplikasi akan diberi tahu bahwa keyboard tersembunyi, lalu ditampilkan lagi. Saat ditampilkan, tampilan lain kemungkinan besar belum dirotasi. Jadi, jika Anda mengamati sendiri acara sembunyikan / tampilkan keyboard, konversikan koordinat saat Anda benar-benar membutuhkannya, bukan di pemberitahuan.

Jika pengguna memisahkan atau melepaskan keyboard, atau menggunakan keyboard hardware, notifikasi akan selalu menampilkan keyboard sebagai tersembunyi. Melepas atau menggabungkan keyboard akan mengirimkan notifikasi "keyboard ditampilkan".

Pendengar harus dijalankan saat keyboard disembunyikan, jika tidak, pemberitahuan pertama akan terlewat, dan akan dianggap bahwa keyboard disembunyikan padahal tidak.

Jadi, sangatlah penting untuk mengetahui apa yang sebenarnya Anda inginkan. Kode ini berguna untuk memindahkan barang-barang keluar dari jalan keyboard (dengan keyboard yang terbelah atau tidak terkunci, itu adalah tanggung jawab pengguna). Itu tidak memberi tahu Anda apakah pengguna dapat melihat keyboard di layar (dalam kasus keyboard terpisah). Itu tidak memberi tahu Anda apakah pengguna dapat mengetik (misalnya ketika ada keyboard perangkat keras). Melihat jendela lain tidak berfungsi jika aplikasi membuat jendela lain itu sendiri.

Chris
sumber
Peringatan bagus tentang keyboard di iPad, terima kasih!
JOM
3

Swift implementasi:

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
  } 
}

Karena swift tidak menjalankan metode pemuatan kelas saat memulai, penting untuk memulai layanan ini saat peluncuran aplikasi:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool
{
  ...    
  KeyboardStateListener.shared.start() 
}
Prcela
sumber
Menggunakan iOS 13, swift 5.0 pada bit terakhir ini, beban kelas tampaknya tidak diperlukan?
user3069232
3

Ini adalah solusi saya, ini merangkum semuanya menjadi satu metode statis, dan Anda dapat memanggilnya di mana saja untuk memeriksanya:

+(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;
}
pthr
sumber
2

Dan inilah cara melakukannya di 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");
}

Jangan lupa untuk membatalkan pendaftaran:

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

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

Dan jika Anda ingin menutup keyboard saat menekan tombol "Kembali":

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;
}

}
Teodor Ciuraru
sumber
1

Coba fungsi ini

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;

}

from: iOS: Bagaimana cara mengakses `UIKeyboard`?

Pelopor
sumber
1

BOOL isTxtOpen = [txtfieldObjct isFirstReponder]. Jika mengembalikan YA, maka keyboard aktif.

Hardik Mamtora
sumber
1

Untuk memeriksa apakah keyboard cuaca muncul, kita dapat menggunakan pemberitahuan Keyboard yang telah ditentukan sebelumnya.

UIKeyboardDidShowNotification, UIKeyboardDidHideNotification

Misalnya saya dapat menggunakan kode berikut untuk mendengarkan notifikasi keyboard

// Dengarkan penampilan dan penghilangan keyboard

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

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

dalam metode saya bisa mendapatkan notifikasi

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

- (void)keyboardDidHide: (NSNotification *) notifyKeyBoardHide{
    // key board is opened
}
Manoj Singhal
sumber
1

Cepat 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
        }
   }
}
Amber K
sumber
Bekerja dengan sangat baik untuk saya (Xcode 10.2, Swift4) hanya ingin tahu mengapa tidak ada yang memilih ini?
infinity_coding7
Tidak, itu tidak berfungsi jika keyboard sudah disajikan oleh pengontrol tampilan sebelumnya.
Ricardo
0

Anda dapat memeriksa semua tampilan teks, bidang teks, dan label secara berulang di sub-tampilan tampilan induk untuk melihat apakah ada responden pertama dengan sesuatu seperti ini:

-(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;
}
Albert Renshaw
sumber
Itu gagal jika Anda memiliki pengontrol tampilan anak
Ricardo
-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
    }
}
Amrit Sidhu
sumber
-5

Saya pikir ini dapat membantu Anda,

+(BOOL)isKeyBoardInDisplay  {

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

    return isExists;
}

Terima kasih,

Naveen Shan

Naveen Shan
sumber
1
Di iOS 6, Hanya karya yang belum muncul! Setelah keyboard mereka ditampilkan sekali, itu berhenti bekerja.
James Laurenstin