Wyświetlacz UIWebView i iPhone 4 retina
Mam UIWebView
, który wyświetla lokalny tekst i obrazy. Albo gdzieś popełniłem błąd, albo UIWebView
nie obsługuje automatycznie przyrostka @2x
dla obrazów o wysokiej rozdzielczości.
Moje pytanie brzmi, czy ktoś jeszcze pomyślnie załadował @2x
obrazy do UIWebView
normalnymi środkami, czy muszę zrobić coś specjalnego? Czy Mogę w jakiś sposób wykryć, czy mój użytkownik ma wyświetlacz siatkówki?
6 answers
Zgodnie z Twoją prośbą...
Test funkcjonalności. Jeśli chcesz wiedzieć, czy musisz wyświetlić obraz siatkówki lub zwykły obraz, sprawdź, czy urządzenie ma wyświetlacz siatkówki, a nie, że jest to konkretny model(przyszłościowa aplikacja najlepiej, jak możesz, oznacza, że musisz zmienić mniej rzeczy, gdy pojawi się nowy model). Aby to zrobić, możesz użyć następującego przykładowego kodu:
if([[UIScreen mainScreen] respondsToSelector:@selector(scale)] &&
[[UIScreen mainScreen] scale] == 2.0)
{
/* We have a retina display. */
}
else
{
/* We do not. */
}
Ten kod jest bezpieczny, od kiedy to napisałem, na wszystkich modelach i na wszystkich firmware wersje. Będzie to również bezpieczne w przyszłych wersjach, dopóki Apple nie wycofa metody scale
, co może nigdy się nie wydarzyć.
Więcej na twoje pytanie, Nie wiem, jak to zrobić w webview bez lokalizacji do obrazu siatkówki i obrazu nie-siatkówki wcześniej. Gdy już mam te informacje, to (w przeszłości) używałem ich do zastąpienia jakiegoś znanego tekstu Sentinela, którego strona oczekiwała ode mnie, ponieważ wpiszę coś w HTML, co miało powiedzieć: {{{image_location}}}
gdzie mógłbym pobrać HTML data, pobierz go do formatu string, a następnie wykonaj zastąpienie tego ciągu, zastępując ten tekst, adresem URL obrazu @ 2x, jeśli jesteśmy na wyświetlaczu retina, z odpowiednim współczynnikiem skali lub obrazem o normalnej wielkości, jeśli nie (za pomocą powyższego kodu).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-13 20:45:46
Używam tego JavaScript hack, aby załadować skalowane obrazy, gdy działa na urządzeniu siatkówki. Zmieni atrybut src
i width
na wszystkich obrazach, aby użyć odpowiedniego skalowanego obrazu. Zauważ, że testowałem to tylko z lokalnymi obrazami.
Ustawienie display: none
, a następnie zresetowanie go na szwach ładowania obrazu, aby naprawić niektóre migotanie. Zauważ również, że ten kod prawdopodobnie nie jest kompatybilny z innymi przeglądarkami niż WebKit.
document.addEventListener("DOMContentLoaded", function() {
var scale = window.devicePixelRatio;
// might want this to be scale != 2
if (scale == undefined || scale == 1) {
return;
}
var re = /^(.*)(\..*)$/;
var images = document.getElementsByTagName("img");
for (var i = 0; i < images.length; i++) {
var img = images[i];
var groups = re.exec(img.src);
if (groups == null) {
continue;
}
img.style.setProperty("display", "none");
img.addEventListener("load", function(event) {
event.target.width /= scale;
event.target.style.setProperty("display", "");
});
img.src = groups[1] + "@" + scale + "x" + groups[2];
}
});
Porada polega na dodaniu tego do pliku o nazwie np. scaledimages.js
, a następnie użycie
<script type="text/javascript" src="scaledimages.js"></script>
Upewnij się, że plik js jest wymieniony w "Copy Bundle Resources", a nie w " Compiled Sources "w Twoich celach"Build faz". Domyślne szwy Xcode wykrywają pliki Javascript jako coś, co lubi kompilować. Należy również pamiętać, że obecny skrypt może zepsuć rzeczy, Jeśli devicePixelRatio
stanie się 3 lub większa w przyszłości, środkiem ostrożności może być zmiana (scale == undefined || scale == 1)
na scale != 2
tylko załadować @2x
na teraz.
Update: istnieje również jQuery-Retina-Display-Plugin, który robi coś podobnego, ale wymaga ustawienia atrybutu width
i seams, aby również użyć żądania HEAD
, aby sprawdzić, czy obraz istnieje, Nie wiem, jak to będzie działać dla plików lokalnych.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-17 05:55:41
Przypuszczałem, że można to również osiągnąć za pomocą magii CSS lub Javascript, aby wyświetlić tylko odpowiedni obraz. Główną ideą jest wstawienie dwóch obrazów, normalnej i wysokiej rozdzielczości, a następnie ustawienie atrybutu CSS display na none , aby zdjęcia miały maskować:
Plik HTML
<link href="default.css" rel="stylesheet" media="screen" type="text/css" />
<link href="highresolution.css" media="screen and (-webkit-min-device-pixel-ratio:2)" type="text/css" rel="stylesheet" />
...
<img src="image.png" width="..." height="..." class="normalRes" />
<img src="[email protected]" width="..." height="..." class="highRes" />
Plik CSS: domyślnie.css
.normalRes { display:block } /* or anything else */
.highRes { display:none }
Plik CSS: highresolution.css
.normalRes { display:none }
.highRes { display:block } /* or anything else */
I ' ve test it a trochę i zadziałało dobrze. Potrzebuję więcej badań. Znalazłem rozwiązanie tutaj: http://www.mobilexweb.com/blog/iphone4-ios4-detection-safari-viewport
Aktualizacja 2012-06-24
Oto inne rozwiązanie bez potrzeby wysokiej rozdzielczości.plik css .
Dodaj następujący kod w domyślnie.css .
@media all and (-webkit-min-device-pixel-ratio: 2) {
.normalRes { display:none }
.highRes { display:block }
...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-24 14:21:57
Just always do:
<img src="[email protected]" width={half-width} />
Dla obrazów tła odwołujących się do CSS, użyj -webkit-background-size do połowy ich rozmiaru.
Wada: urządzenia nie-retina będą pobierać obrazy oversized.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-01 17:38:48
Najlepszym rozwiązaniem jest użycie obrazów o wysokiej rozdzielczości zarówno dla przeglądów internetowych opartych na siatkówce, jak i innych. Następnie Ustaw Rozmiar obrazu (w punktach) za pomocą atrybutu szerokość i wysokość.
<img src="hi-res-icon.png" width="10px" height="10px" />
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-20 12:21:16
Jeśli chodzi o wykrywanie, możesz użyć tej próbki kodu . Właśnie go zaktualizowałem, aby wykryć iPhone ' a 4.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-16 06:41:59