Quando eu inicio meu aplicativo no modo retrato, ele funciona bem. Então eu giro para paisagem e é ampliado. Para obter a escala correta para o modo paisagem, tenho que tocar duas vezes em algo, primeiro para aumentar o zoom totalmente (o comportamento normal do toque duplo) e novamente para diminuir o zoom (novamente, o comportamento normal do toque duplo) . Quando diminui o zoom, ele diminui para a NOVA escala correta para o modo paisagem.
Voltar para o retrato parece funcionar de forma mais consistente; ou seja, ele controla o zoom para que a escala esteja correta quando a orientação voltar a ser retrato.
Estou tentando descobrir se isso é um bug? ou se isso é algo que pode ser corrigido com JavaScript?
Com o conteúdo meta da janela de visualização, estou definindo a escala inicial para 1,0 e NÃO estou definindo a escala mínima ou máxima (nem quero). Estou definindo a largura para a largura do dispositivo.
Alguma ideia? Eu sei que muitas pessoas ficariam gratas por uma solução, pois parece ser um problema persistente.
fonte
Respostas:
Jeremy Keith ( @adactio ) tem uma boa solução para isso em seu blog Orientação e escala
Mantenha a marcação escalonável, não definindo uma escala máxima na marcação.
Em seguida, desative a escalabilidade com javascript no carregamento até que o gestor seja reiniciado quando você permitir a escalabilidade novamente com este script:
Atualização 22-12-2014:
Em um iPad 1 isso não funciona, falha no ouvinte de eventos. Descobri que a remoção
.body
corrige isso:fonte
maximum-scale=1.0
efeito permanece após o início do gesto. Existe alguma maneira de corrigir isso?Scott Jehl veio com uma solução fantástica que usa o acelerômetro para antecipar mudanças de orientação. Esta solução é muito responsiva e não interfere nos gestos de zoom.
https://github.com/scottjehl/iOS-Orientationchange-Fix
Fonte reduzida:
fonte
Eu tive o mesmo problema, e definir a escala máxima = 1,0 funcionou para mim.
Editar: Como mencionado nos comentários, isso desabilita o zoom do usuário, exceto quando o conteúdo excede a resolução de largura. Conforme mencionado, isso pode não ser sábio. Também pode ser desejado em alguns casos.
O código da janela de visualização:
fonte
Se você tiver a largura definida na janela de visualização:
E então mude a orientação que irá aumentar o zoom aleatoriamente às vezes (especialmente se você estiver arrastando na tela) para corrigir isso não defina uma largura aqui que usei:
Isso corrige o zoom, aconteça o que acontecer, então você pode usar o evento window.onorientationchange ou, se quiser que seja independente da plataforma (útil para testar), o método window.innerWidth .
fonte
MobileSafari suporta o
orientationchange
evento nowindow
objeto. Infelizmente, não parece haver uma maneira de controlar diretamente o zoom via JavaScript. Talvez você possa escrever / alterar dinamicamente ameta
tag que controla a janela de visualização - mas eu duvido que funcione, isso afeta apenas o estado inicial da página. Talvez você possa usar este evento para realmente redimensionar seu conteúdo usando CSS. Boa sorte!fonte
Eu criei uma demonstração funcional de um layout de paisagem / retrato, mas o zoom deve ser desativado para que funcione sem JavaScript:
http://matthewjamestaylor.com/blog/ipad-layout-with-landscape-portrait-modes
fonte
Tenho usado essa função em meu projeto.
então apenas addEventListener:
fonte
Eu encontrei uma nova solução alternativa, diferente de qualquer outra que já vi, ao desativar o zoom nativo do iOS e, em vez disso, implementar a funcionalidade de zoom em JavaScript.
Um excelente pano de fundo sobre as várias outras soluções para o problema de zoom / orientação é de Sérgio Lopes: Uma correção para o famoso bug de zoom do iOS na mudança de orientação para retrato .
Poderia ser melhorado, mas para minhas necessidades evita as principais desvantagens que ocorrem com todas as outras soluções que já vi. Até agora, só testei usando o Safari para celular em um iPad 2 com iOS4.
O foco () / desfoque () é uma solução alternativa para evitar o bloqueio ocasional da funcionalidade de zoom que pode ocorrer após alterar a orientação e aplicar zoom algumas vezes.
Definir o document.body.style força um repintura de tela inteira, o que evita problemas intermitentes ocasionais em que a repintura falha gravemente após o zoom.
fonte
Elisabeth, você pode alterar o conteúdo da janela de visualização dinamicamente adicionando a propriedade "id" à metatag:
Então você só pode ligar por javascript:
fonte
Esta é outra maneira de fazer isso, que parece funcionar bem.
Defina a metatag para restringir a janela de visualização a escala = 1, o que evita o zoom:
<meta name = "viewport" content = "width = device-width, initial-scale = 1, minimum-scale = 1, maximum-scale = 1">
Com javascript, altere a metatag 1/2 segundo depois para permitir o zoom:
setTimeout (function () {document.querySelector ("meta [name = viewport]"). setAttribute ('content', 'width = device-width, initial-scale = 1');}, 500);
Novamente com javascript, na mudança de orientação, recarregue a página:
window.onorientationchange = function () {window.location.reload ();};
Cada vez que você reorienta o dispositivo, a página é recarregada, inicialmente sem zoom. Mas meio segundo depois, a capacidade de zoom é restaurada.
fonte
Encontrou uma correção de implementação muito fácil. Defina o foco para um elemento de texto que tenha um tamanho de fonte de 50 px ao completar o formulário. Parece não funcionar se o elemento de texto estiver oculto, mas ocultar esse elemento é facilmente feito configurando as propriedades de cor do elemento para não ter opacidade.
fonte