2010-09-16 34 views
14

Tôi có một số UIWebView hiển thị một số văn bản và hình ảnh cục bộ. Hoặc tôi đã phạm sai lầm ở đâu đó, hoặc UIWebView không tự động xử lý hậu tố @2x cho hình ảnh có độ phân giải cao.UIWebView và màn hình iPhone 4 võng mạc

Vì vậy, câu hỏi của tôi là có ai khác đã tải thành công @2x hình ảnh vào một số UIWebView thông qua các phương tiện thông thường hoặc tôi có cần làm một điều gì đó đặc biệt không? Tôi có thể phát hiện bằng cách nào đó nếu người dùng của tôi có màn hình võng mạc không?

Trả lời

15

Theo yêu cầu của bạn ...

Kiểm tra chức năng. Nếu bạn muốn biết nếu bạn cần hiển thị hình ảnh võng mạc hoặc hình ảnh thông thường, hãy kiểm tra xem thiết bị của bạn có màn hình võng mạc hay không, không phải là mẫu của một mô hình cụ thể (bằng chứng trong tương lai ứng dụng của bạn tốt nhất có thể, có nghĩa là bạn phải thay đổi ít công cụ hơn khi một mô hình mới xuất hiện). Để thực hiện việc này, bạn có thể sử dụng mã mẫu sau:

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

Mã này an toàn, vào thời điểm tôi viết, trên tất cả các kiểu máy và trên tất cả các phiên bản phần mềm. Nó sẽ được an toàn trên các phiên bản tương lai cho đến khi Apple không chấp nhận phương thức scale, điều này có thể không bao giờ xảy ra.

Thông tin thêm về câu hỏi của bạn, tôi không biết cách thực hiện điều đó trong chế độ xem web mà không cần phải định vị trước hình ảnh võng mạc và hình ảnh không phải võng mạc. Một khi tôi có thông tin đó, tôi đã sử dụng nó để thay thế một số văn bản được gửi đi mà trang web mong đợi tôi thay thế, như tôi sẽ đặt một thứ gì đó trong HTML có nội dung: {{{image_location}}} nơi tôi có thể tải xuống HTML dữ liệu, đưa nó vào định dạng chuỗi, sau đó thay thế chuỗi đó thay thế văn bản đó bằng URL của hình ảnh 2x nếu chúng tôi hiển thị võng mạc, với hệ số tỷ lệ thích hợp hoặc hình ảnh có kích thước bình thường nếu không (sử dụng mã trên).

Hy vọng điều này sẽ giúp ích nếu không có ai đến cùng với giải pháp tốt hơn.

+0

Vì không có câu trả lời nào tốt hơn, tôi chấp nhận giải pháp này như một giải pháp khả thi. Lý tưởng nhất là UIWebView nên xử lý chính nó cho hình ảnh cục bộ, nhưng kiểm tra quy mô màn hình thiết bị và điều chỉnh HTML cho phù hợp. –

+0

Trên iPad ở chế độ 2x, tỷ lệ cũng là 2.0. – occulus

+0

Chắc chắn, nhưng điều đó liên quan đến các ứng dụng iPhone. Ứng dụng iPad không chạy ở chế độ thu nhỏ. Vì vậy, nếu bạn xử lý trường hợp này đúng cách trên ứng dụng iPhone của bạn, không phải là một vấn đề. :) – jer

0

Để phát hiện, bạn có thể sử dụng this code sample. Tôi vừa cập nhật nó để phát hiện iPhone 4.

+1

-1 để đề xuất mã kiểm tra thiết bị chứ không phải cho chức năng. Đề nghị kiểm tra xem 'UIScreen' có phản ứng với' scale' không, và nếu vậy, hãy gọi 'scale' trên' UIScreen's 'mainScreen' và kiểm tra xem giá trị của nó là 2.0. Nếu những điều kiện đó là đúng, màn hình hiển thị võng mạc. – jer

+0

Trong trường hợp này, bạn không thể nhận được thông tin xác thực sai, vì vậy tôi sẽ không ngần ngại. Nhưng kiểm tra màn hình thì tốt hơn, vâng. – zoul

+0

Hoàn tác ghi chú cho xác nhận ở trên. Chỉ cần thêm một điều nữa, lý do tôi downvoted là vì các loại kiểm tra phần cứng này hoạt động tốt trong một thời gian, nhưng trong 5 tháng khi Apple phát hành một thiết bị mới (có thể với màn hình võng mạc), chúng tôi phải chỉnh sửa mã để làm cho nó hoạt động ở đó, trong khi nếu chúng ta kiểm tra tỷ lệ, nó hoạt động tự động. – jer

2

Chỉ cần luôn luôn làm:

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

cho CSS tham chiếu hình ảnh nền, sử dụng -webkit-background-kích thước một nửa kích thước chúng.

Bất lợi: Thiết bị không phải võng mạc sẽ tải xuống hình ảnh quá khổ.

4

Tôi cho rằng điều này cũng có thể đạt được bằng cách sử dụng một số phép thuật CSS hoặc Javascript để chỉ hiển thị hình ảnh phù hợp. Ý tưởng chính là để chèn hai hình ảnh, độ phân giải bình thường và cao và sau đó thiết lập các thuộc tính CSS hiển thị-none cho hình ảnh để mặt nạ:

tập tin 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" /> 

Tệp CSS: mặc định.css

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

CSS file: highresolution.css

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

Tôi đã thử nghiệm nó một chút và nó làm việc tốt. Cần thêm bài kiểm tra ngay bây giờ. tôi đã tìm thấy các giải pháp ở đây: http://www.mobilexweb.com/blog/iphone4-ios4-detection-safari-viewport

CẬP NHẬT 2012-06-24

Dưới đây là một giải pháp mà không cần cho highresolution.css tập tin.
Thêm mã sau vào default.css.

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

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

    ... 
+0

Thuộc tính __width__ và __height__ cho thẻ __img__ phải có giá trị lưu cho hình ảnh bình thường và võng mạc. Nói cách khác, chỉ __src__ tên tệp và __class__ thay đổi giá trị từ hình ảnh bình thường sang hình ảnh võng mạc. – Domsware

1

Giải pháp tốt nhất là sử dụng hình ảnh có độ phân giải cao cho cả WebViews võng mạc và không dựa trên võng mạc. Sau đó, đặt kích thước của hình ảnh (theo điểm) bằng cách sử dụng thuộc tính chiều rộng và chiều cao.

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

eek, xin lỗi! Tôi khá nhiều sao chép câu trả lời của Hafthor – mc7h

5

Tôi sử dụng bản hack Javascript này để tải hình ảnh được chia tỷ lệ khi chạy trên thiết bị võng mạc. Nó sẽ thay đổi thuộc tính srcwidth trên tất cả các hình ảnh để sử dụng hình ảnh được chia tỷ lệ tương ứng. Lưu ý rằng tôi đã chỉ thử nghiệm này với hình ảnh địa phương.

Đặt display: none và sau đó đặt lại trên đường nối tải hình ảnh để sửa một số nhấp nháy. Cũng lưu ý rằng mã này có thể không tương thích với các trình duyệt khác so với 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]; 
    } 
}); 

Mẹo là thêm tệp này vào tệp, ví dụ: scaledimages.js và sau đó sử dụng

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

Hãy chắc chắn rằng js-file được liệt kê trong "Copy Bundle Tài" và không có trong "Biên soạn Nguồn" trong mục tiêu của bạn "Xây dựng giai đoạn". Các đường nối Xcode mặc định phát hiện các tệp Javascript như một cái gì đó mà nó thích biên dịch. Cũng lưu ý rằng tập lệnh hiện tại có thể vi phạm nếu devicePixelRatio xảy ra từ 3 trở lên trong tương lai, đề phòng có thể là thay đổi (scale == undefined || scale == 1) thành scale != 2 chỉ tải @2x bây giờ.

Cập nhật: Ngoài ra còn có một jQuery-Retina-Display-Plugin rằng làm điều gì đó tương tự nhưng đòi hỏi bạn phải thiết lập các width thuộc tính và vỉa cũng sử dụng một yêu cầu HEAD để xem hình ảnh tồn tại, không chắc chắn làm thế nào mà sẽ làm việc cho các tập tin địa phương.

+0

Tôi không lý do tại sao điều này đã được bình chọn. Tôi đã sử dụng điều này trong một ứng dụng bản thân mình và nó hoạt động tốt, ít nhất là với các trang HTML nhỏ với không có nhiều hình ảnh. Nhưng tôi thú nhận nó là một hack xấu xí :) –

+0

Tôi xin lỗi, đó là tôi. Tôi nghĩ tôi Up bình chọn nó nhưng vô tình phải nhấn nút Down, và stackoverflow không cho phép tôi thay đổi nó nữa. Xin vui lòng cập nhật câu trả lời, ngay cả khi bạn có thêm một không gian thêm :) Điều đó sẽ cho phép tôi thay đổi trạng thái, tôi đoán. Tôi đã tự mình thử nghiệm nó, và nó hoạt động như một sự quyến rũ. Tôi cũng sử dụng nó với các trang HTML nhỏ. – Mustafa

+0

:) Tôi đã tự mình mắc lỗi tương tự. Thử ngay bây giờ. –

Các vấn đề liên quan