Использование подклассов NSLayoutConstraint
В прокручиваемом представлении - будь то UITableView
, UIScrollView
или даже UIView
- когда появляется клавиатура, она занимает место и обычно означает, что вам нужно настроить вид, чтобы он динамически реагировал в зависимости от видимости клавиатуры.
Наиболее распространенный способ справиться с этим - использовать NotificationCenter
для ответа на следующие события:
UIResponder.keyboardWillHideNotification
UIResponder.keyboardWillChangeFrameNotification
Это работает, но вам нужно добавить код в каждый класс, который использует клавиатуру для его обработки. Один из вариантов, предлагаемых Взлом со Swift:
Это работает блестяще, и в этом нет ничего плохого. Однако давайте посмотрим, есть ли другой способ справиться с этим.
Я предпочитаю, чтобы моя логика UIView
и UIViewController
была как можно более конкретной для этой точки зрения и абстрагировалась от общей логики, где это возможно. Я считаю, что это улучшает читаемость кода и увеличивает скорость, с которой вы можете понять незнакомый класс.
Представляем подклассы NSLayoutConstraint
Здесь становится полезным создание подкласса NSLayoutConstraint
. Размещение всей логики для расширения и сжатия в зависимости от того, отображается ли клавиатура или скрывается, позволяет нам просто установить ограничение и не беспокоиться об обработке логики для него.
Если вы используете AutoLayout
, вы можете просто установить класс как вариант подкласса в вашем проекте, как показано ниже:
В качестве альтернативы вы можете создать ограничение программно, хотя я предпочитаю использовать AutoLayout
там, где это необходимо.
Единственным недостатком этого подхода является то, что если кто-то в конечном итоге заменит это ограничение на ограничение, не являющееся подклассом, это нарушит представление. С учетом сказанного, что-то подобное должен найти разработчик или, в худшем случае, поймать с помощью хорошей практики тестирования. Я считаю, что положительные стороны этого подхода намного перевешивают недостатки.
Ниже представлен мой вариант подкласса, который является модификацией подкласса, созданного Meng To, который вы можете использовать в своих проектах:
Вот и все! Спасибо, что прочитали эту статью. Надеюсь, это научило вас чему-то новому.