Есть еще один уровень для этого.
- Если у вас нет inputAccessoryView, вы не получите уведомление, как указывают приведенные выше объяснения.
- Однако, если вы настроили inputAccessoryView для текстаview, тогда вы все равно будете получать уведомление UIKeyboard, когда присутствует внешний kbd - логика заключается в том, что вам нужно будет анимировать ваше представление в нужном месте, поэтому вам понадобится информация анимации, содержащаяся в уведомлении.
К счастью, в событии достаточно информации, чтобы выяснить, будет ли представлен kbd, хотя он все еще немного задействован.
Если мы рассмотрим словарь уведомлений, то увидим этоинформация:
UIKeyboardFrameBeginUserInfoKey = NSRect: {{0, 1024}, {768, 308}}
UIKeyboardFrameEndUserInfoKey = NSRect: {{0, 980}, {768, 308}}
Это было в Портрете;если мы поворачиваем устройство в PortraitUpsideDown, мы получаем:
UIKeyboardFrameBeginUserInfoKey = NSRect: {{0, -308}, {768, 308}}
UIKeyboardFrameEndUserInfoKey = NSRect: {{0, -264}, {768, 308}}
Аналогично в LandscapeLeft и LandscapeRight мы получаем разные начальные и конечные местоположения.
Хмм ... что означают эти числа?Вы можете видеть, что kbd запускается вне экрана, но он немного двигается.Что еще хуже, в зависимости от ориентации устройства, местоположения kbd разные.
Тем не менее, у нас достаточно информации, чтобы выяснить, что происходит:
- КБД перемещается от физического экрана внизу устройства к той же высоте, что и inputAccessoryView (но затенено им)
- Так что в случае Портрета он перемещается с 1024 на 980 - у нас должен быть inputAccessoryView с высотой 44, что действительно имеет место.
- Так в Портретеесли конец y + высота inputAccessoryView == высота экрана, то kbd не отображается.Вам нужно справиться с другими поворотами, но это идея.