API Visualviewport abaixo do iOS 13

Olá,

Vi que o Discourse de alguma forma conseguiu calcular a posição superior do teclado virtual no iOS.
Isso é importante se você quiser posicionar algo logo acima do teclado virtual, como este campo de entrada onde estou digitando agora.

Isso não é um problema em dispositivos Android com navegador, pois elementos com position: fixed são automaticamente empurrados para o topo do teclado visual quando ele se torna visível.

A solução alternativa para iOS é usar a API VisualViewport https://developer.mozilla.org/en-US/docs/Web/API/Visual_Viewport_API.
O único problema é que não há suporte para dispositivos anteriores ao iOS 13…

Testei este mesmo campo de entrada em um dispositivo com iOS 12.1 e, aparentemente, o Discourse conseguiu replicar o comportamento desejado mesmo em versões do Safari para iOS não suportadas.

Alguém poderia me indicar o caminho certo para alcançar o mesmo resultado? Agradeceria muito :smiley:

Atenciosamente,
Wouter Vermeersch

Lembro disso ser uma “montanha de hacks”, como o @sam chamou. Não tenho certeza se você realmente quer ir por aí..

2 curtidas

Posso imaginar que é uma montanha de hacks. Estou me quebrando a cabeça com isso há dias, então estou pronto e disposto a escalar essa montanha com prazer :grinning: ..

Já tive que implementar um hack bem sujo para evitar que o Safari móvel levantasse a barra fixa superior ao focar em um campo de entrada. Na verdade, acho que não será muito pior do que o que tive que fazer para conseguir isso :stuck_out_tongue_closed_eyes:

2 curtidas

O hack terrível era arrancar coisas da posição fixa quando a textarea ganhava foco e ocultar tudo na página. Depois, trazê-lo de volta quando a textarea perdia o foco.

Era muito peculiar. Muito feliz que @pmusaraj apresentou uma implementação muito mais robusta.

5 curtidas

O código relevante para ambas as soluções está aqui: https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/lib/safari-hacks.js

Como observado nesse arquivo, porém, em breve removeremos as correções para o iOS 12. O iOS 14 foi lançado este ano, e apenas cerca de 5% dos dispositivos ainda estão no iOS 12.

4 curtidas

Obrigado por compartilhar! :smiley:

Dei uma olhada rápida na sua solução alternativa e, aparentemente, você optou por codificar manualmente os tamanhos de todos os possíveis tamanhos de teclado?

No entanto, quando eles desativam a sugestão automática, o teclado muda de tamanho. Como isso lida com isso?

Não sabia que o público usando iOS 12 era tão baixo. Tem certeza de que apenas 5% ainda estão com iOS 12 ou inferior? Nesse caso, pode ser perda de tempo focar nesse problema específico.

Verifiquei no iPhone 6 rodando iOS 2.14

A solução alternativa funciona perfeitamente quando o preenchimento automático está ativado… quando o preenchimento automático é desativado, permanecemos com um espaço em branco… mas, como você já mencionou, a quantidade de usuários ainda presos no iOS 12 é muito baixa… Ainda menor para usuários presos no iOS 12 com o preenchimento automático desativado.

Portanto, sua correção é a melhor que consigo imaginar. Obrigado por compartilhar! :wink:

Não sei se existem números oficiais, mas este gráfico da Mixpanel mostra que o iOS 12 e versões anteriores representam 7%.

Concordo plenamente que não vale a pena seu esforço focar em uma correção para isso no iOS 12.

3 curtidas