Move View with Keyboard Using Swift: Otimização e Performance
\n\nTodo desenvolvedor iOS já enfrentou pelo menos uma vez a situação em que o teclado cobre descaradamente um UITextField ou UITextView. O usuário toca no campo, o teclado aparece, mas a interface permanece impassível. O resultado: irritação, erros de digitação e desinstalação do aplicativo. Resolver esse problema em Swift não é apenas "move view with keyboard", mas toda uma ciência sobre performance e experiência do usuário.
Neste artigo, vamos analisar como implementar corretamente o move view with keyboard using Swift, otimizar animações e evitar erros comuns. Você receberá código pronto que pode ser inserido diretamente no projeto e entenderá por que algumas abordagens travam a UI, enquanto outras funcionam perfeitamente.
\n\nPor que as soluções padrão geralmente funcionam mal?
\n\nNo Stack Overflow, a pergunta "Move view with keyboard using Swift" acumulou milhares de visualizações. E não é por acaso. Muitos iniciantes copiam a primeira solução que encontram de 2015, que usa UIKeyboardWillShowNotification e altera rigidamente o frame de uma UIView. Resultado: animação instável, vazamentos de memória e bugs em diferentes modelos de iPhone.
Principais problemas das abordagens antigas:
\n- \n
- Alteração direta do
framesem considerar asafe area; \n - Ignorar a duração e as curvas de animação do teclado; \n
- Falta de tratamento para rotação de tela e multitarefa; \n
- Esquecimento: notificações não são removidas, objetos não são limpos. \n
O Swift moderno (5.0+) e o UIKit permitem fazer tudo de forma elegante e rápida. Vamos analisar o padrão ideal.
\n\nPreparação: o que vamos precisar
\n\nPara implementar o move view with keyboard using Swift, usaremos:
\n- \n
NotificationCenterpara monitorar eventos do teclado; \n UIView.animatecom parâmetros da notificação; \n UIScrollViewcomo contêiner base (mas também pode ser sem ele); \n - Gerenciamento adequado de memória (weak self, removeObserver). \n
Todo o código será escrito em um UIViewController. Se você usa SwiftUI, os princípios são os mesmos, mas a API é diferente (falaremos sobre isso no final do artigo).
Passo 1: Registrar as notificações do teclado
\n\nA primeira coisa a fazer é se inscrever em duas notificações principais: UIResponder.keyboardWillShowNotification e UIResponder.keyboardWillHideNotification. São elas que nos fornecem o tamanho, a duração e a curva da animação.
override func viewDidLoad() {\n super.viewDidLoad()\n \n NotificationCenter.default.addObserver(\n self,\n selector: #selector(keyboardWillShow),\n name: UIResponder.keyboardWillShowNotification,\n object: nil\n )\n \n NotificationCenter.default.addObserver(\n self,\n selector: #selector(keyboardWillHide),\n name: UIResponder.keyboardWillHideNotification,\n object: nil\n )\n}\n\n\nObserve: object: nil significa que estamos ouvindo notificações de qualquer teclado. Isso é correto para a maioria dos casos.
Passo 2: Manipulador keyboardWillShow
\n\nNeste método, extraímos da notificação o tamanho do teclado e a duração da animação. Em seguida, movemos a view para cima pela altura do teclado.
\n\n@objc private func keyboardWillShow(_ notification: Notification) {\n guard let userInfo = notification.userInfo,\n let keyboardFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect,\n let duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double,\n let curve = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt else {\n return\n }\n \n let keyboardHeight = keyboardFrame.height\n let animation