Przetestowałem wczoraj moją aplikację opartą na Cordovie na symulatorze iPhone'a X w Xcode 9.0 (9A235) i nie wyglądała dobrze. Po pierwsze, zamiast wypełniać cały obszar ekranu, nad i pod zawartością aplikacji był czarny obszar. Co gorsza, między zawartością aplikacji a czernią były dwa białe paski.
Dodanie do cordova-plugin-wkwebview-engine
renderowania Cordova przy użyciu WKWebView (nie UIWebView) naprawia białe paski. Moja aplikacja nie jest migrowana z UIWebView do WKWebView z powodu problemów z wydajnością i wyciekiem pamięci podczas używania, cordova-plugin-wkwebview-engine
które występują podczas ładowania obrazów pobranych z hostowanej zawartości Inapp Purchase do kanwy HTML5 (bezpośredni file://
dostęp przez Webview nie jest możliwy z powodu ograniczeń bezpieczeństwa w WKWebView, więc dane obrazu należy załadować za pośrednictwem cordova-plugin-file
).
Te zrzuty ekranu pokazują aplikację testową z niebieskim tłem ustawionym na <body
>. Powyżej i poniżej UIWebView widać białe paski, ale nie w przypadku WKWebView:
(źródło: pbrd.co )
(źródło: pbrd.co )
Oba widoki internetowe Cordova wyświetlają czarne obszary w porównaniu z natywną aplikacją, która wypełnia cały obszar ekranu:
<meta>
tagu do mojego pliku cordova index.hml, ponieważ inne wymienione poniżej nie działają. Używam Cordova 7x z Cordova-ios 4.5.4 - czy jest jeszcze coś, co muszę zrobić?Odpowiedzi:
Rozwiązanie białych pasków znalazłem tutaj :
Ustaw
viewport-fit=cover
na<meta>
etykiecie rzutni , tj .:Następnie białe paski w UIWebView znikają:
Rozwiązaniem umożliwiającym usunięcie czarnych obszarów (dostarczonych przez @dpogue w komentarzu poniżej) jest użycie obrazów LaunchStoryboard w
cordova-plugin-splashscreen
celu zastąpienia starszych obrazów uruchamiania, używanych domyślnie przez Cordovę . Aby to zrobić, dodaj następujące elementy do platformy iOS wconfig.xml
:Następnie utwórz obrazy o następujących wymiarach
res/screen/ios
(usuń wszystkie istniejące):Po usunięciu czarnych pasków jest jeszcze jedna rzecz, która różni się w iPhonie X do rozwiązania: pasek stanu jest większy niż 20 pikseli ze względu na „wycięcie”, co oznacza, że każda zawartość w górnej części aplikacji Cordova będzie zasłonięta. :
Zamiast na
safe-area-inset-*
stałe kodować dopełnienie w pikselach, możesz obsłużyć to automatycznie w CSS, używając nowych stałych w iOS 11.Uwaga: w iOS 11.0 funkcja obsługująca te stałe została wywołana,
constant()
ale w iOS 11.2 Apple zmienił jej nazwę naenv()
( patrz tutaj ), dlatego aby objąć oba przypadki, musisz przeciążać regułę CSS oboma i polegać na mechanizmie rezerwowym CSS, aby zastosować odpowiedni:Wynik jest zgodny z oczekiwaniami: zawartość aplikacji obejmuje cały ekran, ale nie jest zasłonięta „wycięciem”:
Stworzyłem projekt testowy Cordova, który ilustruje powyższe kroki: webview-test.zip
Uwagi:
Przyciski stopki
safe-area-inset-bottom
aby uniknąć ich nakładania się na wirtualny przycisk Home na iPhonie X.<body>
ponieważ stopka jest absolutnie ustawiona, więc musiałem zastosować ją bezpośrednio do stopki:cordova-plugin-statusbar
cordova-plugin-statusbar
wyświetlają się nieprawidłowo na iPhonie X.[email protected]
wydania, więc upewnij się, że używasz przynajmniej tej wersji do zastosowania do wstawek do bezpiecznego obszaruekran powitalny
[email protected]
, więc upewnij się, że używasz najnowszej wersjicordova-ios
platformy.orientacja urządzenia
safe-area-inset
nie są one ponownie stosowane, co powoduje ponowne zasłonięcie zawartości przez wycięcie (co zostało podkreślone przez jms w komentarzu poniżej).cordova-plugin-wkwebview-engine
.Dla porównania, jest to oryginalny numer Cordova, który otworzyłem, który zawiera to: https://issues.apache.org/jira/browse/CB-13273
źródło
viewport-fit=cover
całą moją aplikację, wyświetla się tylko pusty biały ekran i nic więcej. Używam iOS11, Xcode9 na iPhonie 7 Plus. Czy ktoś doświadcza podobnego zachowania?constant
doenv
hasła - patrz też: webkit.org/blog/7929/designing-websites-for-iphone-xDo ręcznej naprawy istniejącego projektu Cordova
Czarne paski
Dodaj to do swojego pliku info.plist . Naprawianie obrazu startowego to osobny problem, np. Jak dodać obraz startowy iPhoneX
Białe paski
Ustaw viewport-fit = cover w metatagu
źródło
UILaunchStoryboardName
i udało mi się usunąć czarne paski. Ale mój ekran powitalny zostaje rozszerzony. Jakiś powód dlaczego? Przyjęta odpowiedź nie działa dla mnieMusisz wykonać 3 kroki
dla problemów z paskiem stanu iOs 11 i nagłówkiem iPhone'a X.
1. Pokrywa dopasowana do rzutni
Dodaj
viewport-fit=cover
do meta widoku w<header>
Demo: https://jsfiddle.net/gq5pt509 (index.html)
config.xml
wnętrza<platform name="ios">
Nie pomijaj tego kroku , jest to wymagane do dopasowania ekranu do pracy iPhone'a X.
Demo: https://jsfiddle.net/mmy885q4 (config.xml)
Użyj
safe-area-inset-left
,safe-area-inset-right
,safe-area-inset-top
lubsafe-area-inset-bottom
Przykład: (Użyj w twoim przypadku!)
Bonus: możesz dodać klasę ciała jak
is-android
lubis-ios
na urządzeniuMożesz więc zrobić coś takiego w CSS
źródło
W moim przypadku, gdy każdy ekran powitalny był indywidualnie projektowany zamiast generowany automatycznie lub układany w formacie storyboardu, musiałem trzymać się mojej konfiguracji ekranu Legacy Launch i dodać obrazy pionowe i poziome, aby kierować orientacje iPhoneX 1125 × 2436 do config.xml tak jak:
Po dodaniu ich do config.xml („viewport-fit = cover” było już ustawione w index.hml) moja aplikacja zbudowana w Ionic Pro wypełnia cały ekran na urządzeniach iPhoneX.
źródło
Tylko uwaga, że
constant
słowo kluczowe use dla bezpiecznych marginesów zostało zaktualizowane doenv
wersji 11.2 beta +https://webkit.org/blog/7929/designing-websites-for-iphone-x/
źródło
Naprawiono problem z obracaniem ekranu iPhone'a X / XS
Na iPhonie X / XS obrót ekranu spowoduje, że wysokość paska nagłówka będzie miała nieprawidłową wartość, ponieważ obliczenie safe-area-inset- * nie odzwierciedlało nowych wartości w czasie odświeżania interfejsu użytkownika. Ten błąd występuje w UIWebView nawet w najnowszym iOS 12. Obejście polega na wstawieniu górnego marginesu o wielkości 1 piksela, a następnie jego szybkim odwróceniu, co spowoduje natychmiastowe ponowne obliczenie wstawienia bezpiecznego obszaru *. Trochę brzydka poprawka, ale działa, jeśli musisz pozostać przy UIWebView z jakiegoś powodu.
Celem kodu jest spowodowanie niewielkiej zmiany w document.body.style.marginTop, a następnie odwrócenie tego. Nie musi to być koniecznie „1 piksel”. Możesz wybrać wartość, która nie powoduje migotania interfejsu użytkownika, ale spełnia swój cel.
źródło
Tworzę aplikacje Cordova od 2 lat i spędziłem tygodnie na rozwiązywaniu związanych z nimi problemów (np. Przewijanie widoku internetowego po otwarciu klawiatury). Oto przetestowane i sprawdzone rozwiązanie dla systemów iOS i Android
PS: Używam iScroll do przewijania zawartości
Dodaj poniżej do config.xml (pierwszy ff po x oznacza krycie)
Obsługuj samodzielnie pozycję przewijania, dodając zdarzenia aktywności do elementów wejściowych
W przypadku Androida zrób to samo, ale zamiast cordova-plugin-webviewcolor zainstaluj cordova-plugin-statusbar i cordova-plugin-navigationbar-color
Oto kod javascript wykorzystujący te wtyczki do pracy zarówno na iOS, jak i Androidzie:
źródło
Jeśli zainstalujesz nowsze wersje
ionic
globalnie, możesz uruchomićionic cordova resources
i wygeneruje dla Ciebie wszystkie obrazy powitalne wraz z odpowiednimi rozmiarami.źródło
Zwróć uwagę, że ten artykuł: https://medium.com/the-web-tub/supporting-iphone-x-for-mobile-web-cordova-app-using-onsen-ui-f17a4c272fcd ma inne rozmiary niż powyżej i cordova strona wtyczki:
Zmieniłem rozmiar obrazów jak powyżej i zaktualizowałem
ios
platformę icordova-plugin-splashscreen
do najnowszej, a flashowanie do białego ekranu po naprawieniu drugiego problemu. Jednak początkowy obraz spash ma teraz białą ramkę na dole.źródło
Default@3x~iphone~comany.png - 1242x2436
obrazem