Использование подклассов NSLayoutConstraint

В прокручиваемом представлении - будь то UITableView, UIScrollView или даже UIView - когда появляется клавиатура, она занимает место и обычно означает, что вам нужно настроить вид, чтобы он динамически реагировал в зависимости от видимости клавиатуры.

Наиболее распространенный способ справиться с этим - использовать NotificationCenter для ответа на следующие события:

UIResponder.keyboardWillHideNotification
UIResponder.keyboardWillChangeFrameNotification

Это работает, но вам нужно добавить код в каждый класс, который использует клавиатуру для его обработки. Один из вариантов, предлагаемых Взлом со Swift:

Это работает блестяще, и в этом нет ничего плохого. Однако давайте посмотрим, есть ли другой способ справиться с этим.

Я предпочитаю, чтобы моя логика UIView и UIViewController была как можно более конкретной для этой точки зрения и абстрагировалась от общей логики, где это возможно. Я считаю, что это улучшает читаемость кода и увеличивает скорость, с которой вы можете понять незнакомый класс.

Представляем подклассы NSLayoutConstraint

Здесь становится полезным создание подкласса NSLayoutConstraint. Размещение всей логики для расширения и сжатия в зависимости от того, отображается ли клавиатура или скрывается, позволяет нам просто установить ограничение и не беспокоиться об обработке логики для него.

Если вы используете AutoLayout, вы можете просто установить класс как вариант подкласса в вашем проекте, как показано ниже:

В качестве альтернативы вы можете создать ограничение программно, хотя я предпочитаю использовать AutoLayout там, где это необходимо.

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

Ниже представлен мой вариант подкласса, который является модификацией подкласса, созданного Meng To, который вы можете использовать в своих проектах:

Вот и все! Спасибо, что прочитали эту статью. Надеюсь, это научило вас чему-то новому.