2015-09-21 3 views
1

Мое приложение отслеживает изменения на клавиатуре для анимации определенных частей пользовательского интерфейса с помощью уведомлений UIKeyboardWillShow и UIKeyboardWillHide.UIKeyboardWillShow Уведомление из других приложений

Проблема, с которой я сталкиваюсь, заключается в том, что когда я переключаюсь с приложения «Сообщения» на клавиатуру, показанную в моем приложении, с помощью переключателя приложений (в состоянии, когда клавиатура не требуется), он вызывает уведомление UIKeyboardWillShow, а затем UIKeyboardWillHide уведомление, которое приводит к тому, что мой пользовательский интерфейс немного подпрыгивает.

Есть ли способ слушать только уведомления о клавиатуре для собственного приложения?

ViewWillAppear

NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillChange:", name: UIKeyboardWillChangeFrameNotification, object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil) 

ViewWillDisappear

NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillChangeFrameNotification, object: nil) 
+0

Это не имеет ничего общего с тем, что вы просили, но вы хотели бы иметь в виду, что 'viewWillAppear' не обязательно означает, что ваша точка зрения действительно появится (я считаю это раздражает или даже массивную ошибку, но это факт жизни), а 'viewWillDisappear' не обязательно означает, что ваш взгляд действительно исчезнет. Таким образом, вам будет лучше перемещать эти методы в 'viewDid', что означает то, что он говорит. – matt

+0

См. Мой ответ здесь http://stackoverflow.com/a/40031687/2774520 –

ответ

1

Любой код? Вы наблюдаете за клавиатурой всего своего приложения или только в viewcontroller?

Всякий раз, когда вы не хотите слушать изменения, которые вы можете removeObserver

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:yourClass name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:yourClass name:UIKeyboardWillHideNotification object:nil]; 
} 

Но будьте осторожны, вы должны использовать NSNotificationCenter правильно.

+0

Спасибо за ваш ответ. Я контролирую его только в ViewController. Я добавляю наблюдателей в viewWillAppear (добавленный выше код) и теперь добавил remove observer в viewWillDisappear, но при переключении обратно он по-прежнему получает триггеры отображения. –

+0

Вы уверены, что код в 'viewWillDisappear' будет выполнен, когда вы покинете приложение? Попробуйте дать «NSLog» в 'viewWillDisappear' для мониторинга. –

+0

Вы правы, он не выполняется там. –

0

Сегодня я столкнулся с этой проблемой. То, что я закончил, заключалось в добавлении наблюдателей, чтобы обнаружить, когда приложение входит и оставляет фон. Если он входит в фон, то удалите наблюдателя на клавиатуре, иначе добавьте наблюдателей на клавиатуре. Что-то вроде этого ... Я уверен, что есть лучший способ, но это сработало для меня. Надеюсь это поможет.

override func viewDidLoad() { 
    super.viewDidLoad() 
    registerForPreviewing(with: self, sourceView: collectionView) 
    addApplicationStateObservers() 
} 

override func viewDidAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    addKeyboardObservers() 
} 

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

deinit { 
    removeApplicationStateObservers() 
    removeKeyboardObservers() 
} 

func applicationIsActive() { 
    let delay = DispatchTime.now() + 0.1 
    DispatchQueue.main.asyncAfter(deadline: delay) { 
     self.addKeyboardObservers() 
    } 
} 

// Observers 
// Application state observers were add to handle edge case scenario where if user is playing a video in expanded pip view on iPhone, if user switchs to another app with keyboard then switch back, the video will disppears. Our app removes and re-adds observer as user enter and exit the app. 

func addApplicationStateObservers() { 
    NotificationCenter.default.addObserver(self, selector: #selector(applicationIsActive), name: .UIApplicationDidBecomeActive, object: nil) 
    NotificationCenter.default.addObserver(self, selector: #selector(removeKeyboardObservers), name: .UIApplicationDidEnterBackground, object: nil) 
} 

func removeApplicationStateObservers() { 
    NotificationCenter.default.removeObserver(self, name: .UIApplicationDidBecomeActive, object: nil) 
    NotificationCenter.default.removeObserver(self, name: .UIApplicationDidEnterBackground, object: nil) 
} 

func addKeyboardObservers() { 
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown), name: .UIKeyboardWillShow, object: nil) 
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden), name: .UIKeyboardWillHide, object: nil) 
} 

func removeKeyboardObservers() { 
    NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillShow, object: nil) 
    NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillHide, object: nil) 
} 
Смежные вопросы