2010-09-16 168 views
14

我有一個UIWebView顯示一些本地文本和圖像。要麼我在某個地方犯了錯誤,要麼UIWebView不會自動處理@2x後綴以獲得高分辨率圖像。UIWebView和iPhone 4視網膜顯示屏

所以,我的問題是有沒有人通過正常的方式成功地將@2x圖像加載到UIWebView,還是我需要做一些特殊的事情?我能否以某種方式檢測我的用戶是否有視網膜顯示器?

回答

15

根據您的要求...

功能測試。如果您想知道是否需要顯示視網膜圖像或常規圖像,請測試您的設備是否具有視網膜顯示屏,而不是特定型號(未來儘可能驗證您的應用程序,這意味着您必須更改當一個新的模型出來時,這些東西就少了)。要做到這一點,你可以使用下面的示例代碼:

if([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && 
    [[UIScreen mainScreen] scale] == 2.0) 
{ 
    /* We have a retina display. */ 
} 
else 
{ 
    /* We do not. */ 
} 

這段代碼是安全的,因爲我寫這一點,在所有型號上的所有固件版本的時間。在未來的版本中它將是安全的,直到Apple棄用scale方法,這種方法可能永遠不會發生。

更多關於你的問題,我不知道如何在webview中做到這一點,事先沒有位置視網膜圖像和非視網膜圖像。一旦我有了這些信息,我就可以使用它來替換一些已知的哨兵文本,這些文本是網頁期望我替換的,例如我會在HTML中添加一些內容:{{{image_location}}},我可以在其中下載HTML數據,將其轉換爲字符串格式,然後替換該字符串替換該文本,如果我們在視網膜顯示器上,則使用@ 2x圖像的URL,使用適當的比例因子,如果不是,則使用正常大小的圖像(使用上面的代碼)。

希望這有助於如果沒有人提供更好的解決方案。

+0

鑑於沒有更好的答案進來,我接受這是一個可行的解決方案。理想情況下,UIWebView應該自己處理本地圖像,但檢查設備的屏幕比例和調整HTML相應的作品。 – 2010-09-19 12:18:34

+0

在2x模式下的iPad上,縮放比例也是2.0。 – occulus 2011-05-27 15:09:42

+0

當然,但這與iPhone應用程序無關。 iPad應用程序不能以縮放模式運行。因此,如果您在iPhone應用程序中正確處理這種情況,則不是問題。 :) – jer 2011-05-27 15:28:30

0

至於檢測,你可以使用this code sample。我剛更新它也檢測iPhone 4.

+1

-1用於推薦測試設備的代碼,而不是功能測試。建議檢查'UIScreen'是否響應'scale',如果是,則調用'UIScreen'的'mainScreen'上的'scale'並檢查其值是否爲2.0。如果這些條件屬實,視網膜顯示。 – jer 2010-09-16 06:22:56

+0

那麼在這種情況下,你不能得到誤報,所以我會毫不猶豫。但是屏幕檢查更好,是的。 – zoul 2010-09-16 06:34:07

+0

沒有得到上述確認的滿意答案。只需再補充一點,我之所以低估它的原因是因爲這些類型的硬件檢查工作很好,但在蘋果發佈新設備(可能帶有視網膜顯示器)的5個月內,我們必須編輯我們的代碼使它在那裏工作,而如果我們檢查規模,它會自動工作。 – jer 2010-09-16 06:41:32

2

就始終做到:

<img src="[email protected]" width={half-width} /> 

對CSS的引用背景圖像,使用-webkit-背景大小的一半大小的他們。

缺點:非視網膜設備將下載超大圖像。

4

我認爲這也可以通過使用一些CSS或Javascript魔術來僅顯示適當的圖片來實現。其主要思想是插入兩張圖片,正常和高分辨率,然後設置CSS屬性顯示沒有的圖片面膜:

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" /> 

CSS file:default。CSS

.normalRes { display:block } /* or anything else */ 
.highRes { display:none } 

CSS文件:highresolution.css

.normalRes { display:none } 
.highRes { display:block } /* or anything else */ 

我已經測試它一點點,效果不錯。現在需要更多的測試。 我發現這裏的解決方案:http://www.mobilexweb.com/blog/iphone4-ios4-detection-safari-viewport

UPDATE 2012-06-24

這裏是不需要highresolution.css文件中的另一個解決方案。
將以下代碼添加到default.css

@media all and (-webkit-min-device-pixel-ratio: 2) { 

    .normalRes { display:none } 
    .highRes { display:block } 

    ... 
+0

__img__標記的__width__和__height__屬性必須具有正常和視網膜圖像的保存值。 換句話說,只有__src__文件名和__class__值從正常圖像變爲視網膜圖像。 – Domsware 2012-06-24 12:08:38

1

最好的解決方案是將高分辨率圖像用於基於視網膜和非視網膜的WebViews。然後使用width和height屬性設置圖像的大小(以點爲單位)。

<img src="hi-res-icon.png" width="10px" height="10px" /> 
+0

eek,對不起!我幾乎重複了Hafthor的回答 – mc7h 2011-07-20 12:23:37

5

我使用此JavaScript hack在視網膜設備上運行時加載縮放圖像。它將更改所有圖像上的srcwidth屬性以使用相應的縮放圖像。請注意,我只用本地圖像進行了測試。

設置display: none然後在圖像加載接縫上重置它以修復一些閃爍。另請注意,此代碼可能與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]; 
    } 
}); 

提示是將其添加到名爲例如scaledimages.js然後用

<script type="text/javascript" src="scaledimages.js"></script> 

確保JS文件在「複製包資源」列出,並在你的目標不是在「編譯源」,「構建階段」。默認的Xcode接口將Javascript文件檢測爲它喜歡編譯的東西。還要注意,如果將來devicePixelRatio碰巧等於或大於3,當前腳本可能會破壞事件,但現在可能需要將(scale == undefined || scale == 1)更改爲scale != 2,現在只需加載@2x

更新:還有一個jQuery-Retina-Display-Plugin,做類似的事情,但需要您設置width屬性和接縫處還使用了HEAD要求,看是否像存在,不知道如何將本地文件的工作。

+0

我不明白爲什麼這會被拒絕投票。我已經在應用程序中使用了它,並且它工作正常,至少在小型HTML頁面上沒有很多圖像。但我承認這是一個醜陋的黑客:) – 2012-04-16 16:05:01

+0

對不起,這是我。我以爲我投了票,但意外地必須按下向下按鈕,並且stackoverflow不會讓我改變它了。請更新答案,即使你有一個額外的空間:)我想這會讓我改變狀態。我自己測試了它,它像一個魅力。我也用它與小的HTML頁面。 – Mustafa 2012-04-17 04:57:38

+0

:)我自己犯了同樣的錯誤。現在試試。 – 2012-04-17 05:57:52