Как я могу определить, когда клавиатура отображается и скрывается в моем приложении?
ios
iphone
iphone-sdk-3.0
user198725878
источник
источник
Ответы:
В методе ViewDidLoad вашего класса, настроенном для прослушивания сообщений о клавиатуре:
// Listen for keyboard appearances and disappearances [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
Затем в указанных вами методах (в данном случае
keyboardDidShow
иkeyboardDidHide
) вы можете что-то с этим сделать:- (void)keyboardDidShow: (NSNotification *) notif{ // Do something here } - (void)keyboardDidHide: (NSNotification *) notif{ // Do something here }
источник
UITextFieldDelegat
e, а затем реализуйтеtextFieldShouldReturn:
метод. Вы получитеtextField
только что введенный аргумент, который можно сравнить со своими собственными текстовыми полями и прокрутить,scrollView
чтобы отобразить соответствующее текстовое поле.Вы можете просто нужно
addObserver
вviewDidLoad
. Но наличиеaddObserver
inviewWillAppear
иremoveObserver
inviewWillDisappear
предотвращает редкие сбои, которые случаются, когда вы меняете свое представление.Swift 4.2
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear), name: UIResponder.keyboardWillHideNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear), name: UIResponder.keyboardWillShowNotification, object: nil) } @objc func keyboardWillAppear() { //Do something here } @objc func keyboardWillDisappear() { //Do something here } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) NotificationCenter.default.removeObserver(self) }
Swift 3 и 4
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear), name: Notification.Name.UIKeyboardWillHide, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear), name: Notification.Name.UIKeyboardWillShow, object: nil) } @objc func keyboardWillAppear() { //Do something here } @objc func keyboardWillDisappear() { //Do something here } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) NotificationCenter.default.removeObserver(self) }
Старый Свифт
override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillAppear:", name: UIKeyboardWillShowNotification, object: nil) NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillDisappear:", name: UIKeyboardWillHideNotification, object: nil) } func keyboardWillAppear(notification: NSNotification){ // Do something here } func keyboardWillDisappear(notification: NSNotification){ // Do something here } override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) NSNotificationCenter.defaultCenter().removeObserver(self) }
источник
deinit
вот так:deinit { NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) }
deinit { NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil) NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil) }
Swift 3:
NotificationCenter.default.addObserver(self, selector: #selector(viewController.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(viewController.keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil) func keyboardWillShow(_ notification: NSNotification){ // Do something here } func keyboardWillHide(_ notification: NSNotification){ // Do something here }
источник
Swift 4:
NotificationCenter.default.addObserver( self, selector: #selector(ControllerClassName.keyboardWillShow(_:)), name: Notification.Name.UIKeyboardWillShow, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(ControllerClassName.keyboardWillHide(_:)), name: Notification.Name.UIKeyboardWillHide, object: nil)
Затем добавляем метод, позволяющий прекратить прослушивание уведомлений, когда жизнь объекта заканчивается: -
Then add the promised methods from above to the view controller: deinit { NotificationCenter.default.removeObserver(self) } func adjustKeyboardShow(_ open: Bool, notification: Notification) { let userInfo = notification.userInfo ?? [:] let keyboardFrame = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue let height = (keyboardFrame.height + 20) * (open ? 1 : -1) scrollView.contentInset.bottom += height scrollView.scrollIndicatorInsets.bottom += height } @objc func keyboardWillShow(_ notification: Notification) { adjustKeyboardShow(true, notification: notification) } @objc func keyboardWillHide(_ notification: Notification) { adjustKeyboardShow(false, notification: notification) }
источник
+=
, Как представляется , сделать вставки получить больше и больше.UIResponder.keyboardWillShowNotification
иUIResponder.keyboardWillHideNotification
, а клавиша с информацией на клавиатуре -UIResponder.keyboardFrameBeginUserInfoKey
.Стриж - 4
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) addKeyBoardListener() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) NotificationCenter.default.removeObserver(self) //remove observer } func addKeyBoardListener() { NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil); NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil); } @objc func keyboardWillShow(_ notification: Notification) { } @objc func keyboardWillHide(_ notification: Notification) { }
источник
В Swift 4.2 имена уведомлений переместились в другое пространство имен. Итак, теперь это
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) addKeyboardListeners() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) NotificationCenter.default.removeObserver(self) } func addKeyboardListeners() { NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil) } @objc private extension WhateverTheClassNameIs { func keyboardWillShow(_ notification: Notification) { // Do something here. } func keyboardWillHide(_ notification: Notification) { // Do something here. } }
источник
Swift 5
Выше указаны правильные ответы. Хотя я бы предпочел создать помощник для завершения
notification's observers
.Выгода:
Образец кода:
extension KeyboardHelper { enum Animation { case keyboardWillShow case keyboardWillHide } typealias HandleBlock = (_ animation: Animation, _ keyboardFrame: CGRect, _ duration: TimeInterval) -> Void } final class KeyboardHelper { private let handleBlock: HandleBlock init(handleBlock: @escaping HandleBlock) { self.handleBlock = handleBlock setupNotification() } deinit { NotificationCenter.default.removeObserver(self) } private func setupNotification() { _ = NotificationCenter.default .addObserver(forName: UIResponder.keyboardWillShowNotification, object: nil, queue: .main) { [weak self] notification in self?.handle(animation: .keyboardWillShow, notification: notification) } _ = NotificationCenter.default .addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: .main) { [weak self] notification in self?.handle(animation: .keyboardWillHide, notification: notification) } } private func handle(animation: Animation, notification: Notification) { guard let userInfo = notification.userInfo, let keyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue, let duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double else { return } handleBlock(animation, keyboardFrame, duration) } }
Как использовать:
private var keyboardHelper: KeyboardHelper? ... override func viewDidLoad() { ... keyboardHelper = KeyboardHelper { [unowned self] animation, keyboardFrame, duration in switch animation { case .keyboardWillShow: print("keyboard will show") case .keyboardWillHide: print("keyboard will hide") } }
}
источник
Ознакомьтесь с разделом « Управление клавиатурой » «Руководства по программированию для текста, Интернета и редактирования», чтобы получить информацию об отслеживании отображаемой или скрытой клавиатуры и о том, как отображать / закрывать ее вручную.
источник
Вы захотите зарегистрироваться для получения двух уведомлений с клавиатуры:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name: UIKeyboardDidShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (keyboardDidHide:) name: UIKeyboardDidHideNotification object:nil];
Отличный пост о том, как настроить TextField на клавиатуру - http://iosdevelopertips.com/user-interface/adjust-textfield-hidden-by-keyboard.html
источник
Swift 4 -
dd 20 october 2017
override func viewDidLoad() { [..] NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear(_:)), name: Notification.Name.UIKeyboardWillHide, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear(_:)), name: Notification.Name.UIKeyboardWillShow, object: nil) } @objc func keyboardWillAppear(_ notification: NSNotification) { if let userInfo = notification.userInfo, let keyboardFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue).cgRectValue { let inset = keyboardFrame.height // if scrollView is not aligned to bottom of screen, subtract offset scrollView.contentInset.bottom = inset scrollView.scrollIndicatorInsets.bottom = inset } } @objc func keyboardWillDisappear(_ notification: NSNotification) { scrollView.contentInset.bottom = 0 scrollView.scrollIndicatorInsets.bottom = 0 } deinit { NotificationCenter.default.removeObserver(self) }
источник
Если у вас больше одного
UITextField
и вам нужно что-то сделать, когда (или до того, как) клавиатура появится или исчезнет, вы можете реализовать этот подход.Добавьте
UITextFieldDelegate
в свой класс. Назначьте целочисленный счетчик, скажем:NSInteger editCounter;
Установите этот счетчик на ноль где-нибудь в
viewDidLoad
. Затем реализуйтеtextFieldShouldBeginEditing
иtextFieldShouldEndEditing
делегируйте методы.В первом добавьте 1 в editCounter. Если значение editCounter становится равным 1 - это означает, что появится клавиатура (в случае если вы вернете YES). Если editCounter> 1 - это означает, что клавиатура уже видна, а фокус находится в другом UITextField.
В
textFieldShouldEndEditing
вычитать 1 из editCounter. Если вы получите ноль - клавиатура будет закрыта, в противном случае она останется на экране.источник
Вы можете использовать библиотеку KBKeyboardObserver . Он содержит несколько примеров и предоставляет простой интерфейс.
источник
Здесь есть CocoaPods, чтобы облегчить наблюдение
NSNotificationCentr
за видимостью клавиатуры: https://github.com/levantAJ/Keyhipod 'Keyhi'
источник
Так что теперь это настоящий ответ.
import Combine class MrEnvironmentObject { /// Bind into yr SwiftUI views @Published public var isKeyboardShowing: Bool = false /// Keep 'em from deallocatin' var subscribers: [AnyCancellable]? = nil /// Adds certain Combine subscribers that will handle updating the /// `isKeyboardShowing` property /// /// - Parameter host: the UIHostingController of your views. func setupSubscribers<V: View>( host: inout UIHostingController<V> ) { subscribers = [ NotificationCenter .default .publisher(for: UIResponder.keyboardWillShowNotification) .sink { [weak self] _ in self?.isKeyboardShowing = true }, NotificationCenter .default .publisher(for: UIResponder.keyboardWillHideNotification) .sink { [weak self, weak host] _ in self?.isKeyboardShowing = false // Hidden gem, ask me how I know: UIAccessibility.post( notification: .layoutChanged, argument: host ) }, // ... Profit .sink { [weak self] profit in profit() }, ] } }
источник