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?

Author: gcamp, 2010-09-16

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).

Mam nadzieję, że to pomoże, jeśli nikt nie znajdzie lepszego rozwiązania.
 15
Author: jer,
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.

 5
Author: Mattias Wadman,
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 }

   ...
 4
Author: Dominique Vial,
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.

 2
Author: Hafthor,
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" />
 1
Author: mc7h,
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.

 0
Author: zoul,
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