От инженера, который исправил это:
Это на самом деле странно. Я не уверен, полагается ли этот пиар на недокументированное поведение, но это должно быть безопасно, даже если это изменится. Вот что происходит.
iOS должна запускать UIResponder.keyboardWillShowNotification, когда клавиатура будет отображаться, и UIResponder.keyboardWillHideNotification, когда клавиатура будет скрыта. Для обоих уведомлений этот код получает кадр клавиатуры:
let beginRect = (tification.userInfo? [UIResponder.keyboardFrameBeginUserInfoKey] как? NSValue) ?. cgRectValue
let endRect = (Notification.userInfo? [UIResponder.keyboardFrameEndUserInfoKey] как? NSValue) ?. cgRectValue
Странно то, что в симуляторе iOS, если программная клавиатура выключена (имитирует внешнюю клавиатуру), UIResponder.keyboardWillShowNotification никогда не запускается (что понятно), а UIResponder.keyboardWillHideNotification запускается, когда текстовое поле становится первым респондентом ( т.е. получает фокус) и когда текстовое поле подает в отставку первый респондент (т.е. теряет фокус). Я предполагаю, что обоснование состоит в том, что эти уведомления запускаются для программной клавиатуры, и в обоих случаях клавиатура скрыта. Опытным путем в iOS 12 (и iPhone X):
A. Когда текстовое поле становится первым респондентом, beginRect.size.height = 0 и endRect.size.height ~ 54. Оба origin.y остаются в ~ 812 (вне экрана).
B. Когда текстовое поле уходит в отставку первым респондентом, beginRect.size.height ~ 54 и endRect.size.height = 0. Оба origin.y остаются в ~ 812 (вне экрана).
Исправление - проверить A и игнорировать его при обработке UIResponder.keyboardWillHideNotification