Kiedy uruchamiam aplikację w trybie pionowym, działa dobrze. Następnie obracam się w krajobraz i jest on powiększany. Aby uzyskać poprawne skalowanie w trybie poziomym, muszę dwukrotnie dotknąć czegoś dwukrotnie, najpierw, aby przybliżyć całkowicie (normalne zachowanie podwójnego dotknięcia) i ponownie, aby powiększyć całkowicie (znowu, normalne zachowanie podwójnego dotknięcia) . Kiedy się pomniejsza, pomniejsza do prawidłowej NOWEJ skali dla trybu poziomego.
Powrót do portretu wydaje się działać bardziej konsekwentnie; to znaczy, obsługuje zoom tak, aby skala była poprawna po zmianie orientacji z powrotem na portret.
Próbuję dowiedzieć się, czy to jest błąd? lub jeśli jest to coś, co można naprawić za pomocą JavaScript?
Z treścią meta widoku ekranu ustawiam początkową skalę na 1.0 i NIE ustawiam minimalnej ani maksymalnej skali (ani nie chcę). Ustawiam szerokość na szerokość urządzenia.
Jakieś pomysły? Wiem, że wiele osób byłoby wdzięcznych za rozwiązanie, ponieważ wydaje się, że jest to trwały problem.
źródło
Odpowiedzi:
Jeremy Keith ( @adactio ) ma na to dobre rozwiązanie na swoim blogu Orientation and scale
Zachowaj skalowalność znaczników, nie ustawiając maksymalnej skali w znacznikach.
Następnie wyłącz skalowalność za pomocą javascript podczas ładowania do momentu rozpoczęcia gestu, gdy ponownie zezwolisz na skalowalność za pomocą tego skryptu:
Aktualizacja 22-12-2014:
Na iPadzie 1 to nie działa, nie działa w przypadku nasłuchiwania. Odkryłem, że usuwanie
.body
poprawek, które:źródło
maximum-scale=1.0
efekt pozostaje aktywny po rozpoczęciu gestu. Czy jest jakiś sposób, aby to naprawić?Scott Jehl wymyślił fantastyczne rozwiązanie, które wykorzystuje akcelerometr do przewidywania zmian orientacji. To rozwiązanie jest bardzo responsywne i nie koliduje z gestami zoomu.
https://github.com/scottjehl/iOS-Orientationchange-Fix
Zminimalizowane źródło:
źródło
Miałem ten sam problem i ustawienie maksymalnej skali = 1.0 zadziałało.
Edycja: jak wspomniano w komentarzach, wyłącza to powiększanie użytkownika, z wyjątkiem sytuacji, gdy zawartość przekracza szerokość-rozdzielczość. Jak wspomniano, może to nie być mądre. W niektórych przypadkach może to być również pożądane.
Kod widoku:
źródło
Jeśli masz szerokość ustawioną w rzutni:
A potem zmień orientację, która będzie czasami losowo powiększana (zwłaszcza jeśli przeciągasz po ekranie), aby to naprawić, nie ustawiaj tutaj szerokości, której użyłem:
To naprawia powiększenie bez względu na to, co się stanie, wtedy możesz użyć zdarzenia window.onorientationchange lub, jeśli chcesz, aby było niezależne od platformy (przydatne do testowania), metoda window.innerWidth .
źródło
MobileSafari obsługuje
orientationchange
zdarzenie nawindow
obiekcie. Niestety wydaje się, że nie ma sposobu na bezpośrednie sterowanie powiększeniem za pomocą JavaScript. Być może mógłbyś dynamicznie pisać / zmieniaćmeta
tag, który kontroluje widok - ale wątpię, żeby to zadziałało, wpływa tylko na początkowy stan strony. Być może przydałoby się to wydarzenie, aby zmienić rozmiar treści za pomocą CSS. Powodzenia!źródło
Stworzyłem działające demo układu poziomego / pionowego, ale powiększenie musi być wyłączone, aby działało bez JavaScript:
http://matthewjamestaylor.com/blog/ipad-layout-with-landscape-portrait-modes
źródło
Używałem tej funkcji w moim projekcie.
więc po prostu dodajEventListener:
źródło
Znalazłem nowe obejście, różniące się od wszystkich innych, które widziałem, wyłączając natywne powiększanie iOS i zamiast tego wdrażając funkcję powiększania w JavaScript.
Doskonałym tłem dla różnych innych rozwiązań problemu powiększenia / orientacji jest Sérgio Lopes: Poprawka słynnego błędu zoomu iOS przy zmianie orientacji na portret .
Można go ulepszyć, ale dla moich potrzeb pozwala uniknąć poważnych wad, które występują w przypadku wszystkich innych rozwiązań, które widziałem. Do tej pory testowałem go tylko przy użyciu mobilnego Safari na iPadzie 2 z iOS4.
Ostrość () / rozmycie () to obejście zapobiegające sporadycznym blokowaniu funkcji powiększania, które może wystąpić po kilkukrotnej zmianie orientacji i powiększeniu.
Ustawienie document.body.style wymusza ponowne malowanie na pełnym ekranie, co pozwala uniknąć sporadycznych sporadycznych problemów, w których malowanie po powiększeniu nie powiedzie się.
źródło
Elisabeth, możesz dynamicznie zmieniać zawartość widocznego obszaru, dodając właściwość "id" do metatagu:
Następnie możesz po prostu zadzwonić przez javascript:
źródło
Oto inny sposób, który wydaje się działać dobrze.
Ustaw metatag, aby ograniczyć rzutnię do scale = 1, co zapobiega powiększaniu:
<meta name = "viewport" content = "width = device-width, initial-scale = 1, minimum-scale = 1, maximum-scale = 1">
Za pomocą javascript zmień metatag 1/2 sekundy później, aby umożliwić powiększanie:
setTimeout (function () {document.querySelector ("meta [name = viewport]"). setAttribute ('content', 'width = device-width, initial-scale = 1');}, 500);
Ponownie z javascriptem, przy zmianie orientacji, załaduj ponownie stronę:
window.onorientationchange = function () {window.location.reload ();};
Za każdym razem, gdy zmieniasz orientację urządzenia, strona ładuje się ponownie, początkowo bez powiększenia. Ale 1/2 sekundy później przywracana jest możliwość powiększania.
źródło
Znalazłem bardzo łatwą do wdrożenia poprawkę. Po wypełnieniu formularza ustaw fokus na element tekstowy, którego rozmiar czcionki wynosi 50 pikseli. Wydaje się, że nie działa, jeśli element tekstowy jest ukryty, ale ukrycie tego elementu można łatwo zrobić, ustawiając właściwości koloru elementów tak, aby nie miały krycia.
źródło