我有一个UIWebView
显示一些本地文本和图像。要么我在某个地方犯了错误,要么UIWebView
不会自动处理@2x
后缀以获得高分辨率图像。UIWebView和iPhone 4视网膜显示屏
所以,我的问题是有没有人通过正常的方式成功地将@2x
图像加载到UIWebView
,还是我需要做一些特殊的事情?我能否以某种方式检测我的用户是否有视网膜显示器?
我有一个UIWebView
显示一些本地文本和图像。要么我在某个地方犯了错误,要么UIWebView
不会自动处理@2x
后缀以获得高分辨率图像。UIWebView和iPhone 4视网膜显示屏
所以,我的问题是有没有人通过正常的方式成功地将@2x
图像加载到UIWebView
,还是我需要做一些特殊的事情?我能否以某种方式检测我的用户是否有视网膜显示器?
根据您的要求...
功能测试。如果您想知道是否需要显示视网膜图像或常规图像,请测试您的设备是否具有视网膜显示屏,而不是特定型号(未来尽可能验证您的应用程序,这意味着您必须更改当一个新的模型出来时,这些东西就少了)。要做到这一点,你可以使用下面的示例代码:
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,使用适当的比例因子,如果不是,则使用正常大小的图像(使用上面的代码)。
希望这有助于如果没有人提供更好的解决方案。
至于检测,你可以使用this code sample。我刚更新它也检测iPhone 4.
-1用于推荐测试设备的代码,而不是功能测试。建议检查'UIScreen'是否响应'scale',如果是,则调用'UIScreen'的'mainScreen'上的'scale'并检查其值是否为2.0。如果这些条件属实,视网膜显示。 – jer 2010-09-16 06:22:56
那么在这种情况下,你不能得到误报,所以我会毫不犹豫。但是屏幕检查更好,是的。 – zoul 2010-09-16 06:34:07
没有得到上述确认的满意答案。只需再补充一点,我之所以低估它的原因是因为这些类型的硬件检查工作很好,但在苹果发布新设备(可能带有视网膜显示器)的5个月内,我们必须编辑我们的代码使它在那里工作,而如果我们检查规模,它会自动工作。 – jer 2010-09-16 06:41:32
就始终做到:
<img src="[email protected]" width={half-width} />
对CSS的引用背景图像,使用-webkit-背景大小的一半大小的他们。
缺点:非视网膜设备将下载超大图像。
我认为这也可以通过使用一些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
这里是不需要highresolution.css文件中的另一个解决方案。
将以下代码添加到default.css。
@media all and (-webkit-min-device-pixel-ratio: 2) {
.normalRes { display:none }
.highRes { display:block }
...
__img__标记的__width__和__height__属性必须具有正常和视网膜图像的保存值。 换句话说,只有__src__文件名和__class__值从正常图像变为视网膜图像。 – Domsware 2012-06-24 12:08:38
最好的解决方案是将高分辨率图像用于基于视网膜和非视网膜的WebViews。然后使用width和height属性设置图像的大小(以点为单位)。
<img src="hi-res-icon.png" width="10px" height="10px" />
eek,对不起!我几乎重复了Hafthor的回答 – mc7h 2011-07-20 12:23:37
我使用此JavaScript hack在视网膜设备上运行时加载缩放图像。它将更改所有图像上的src
和width
属性以使用相应的缩放图像。请注意,我只用本地图像进行了测试。
设置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
要求,看是否像存在,不知道如何将本地文件的工作。
我不明白为什么这会被拒绝投票。我已经在应用程序中使用了它,并且它工作正常,至少在小型HTML页面上没有很多图像。但我承认这是一个丑陋的黑客:) – 2012-04-16 16:05:01
对不起,这是我。我以为我投了票,但意外地必须按下向下按钮,并且stackoverflow不会让我改变它了。请更新答案,即使你有一个额外的空间:)我想这会让我改变状态。我自己测试了它,它像一个魅力。我也用它与小的HTML页面。 – Mustafa 2012-04-17 04:57:38
:)我自己犯了同样的错误。现在试试。 – 2012-04-17 05:57:52
鉴于没有更好的答案进来,我接受这是一个可行的解决方案。理想情况下,UIWebView应该自己处理本地图像,但检查设备的屏幕比例和调整HTML相应的作品。 – 2010-09-19 12:18:34
在2x模式下的iPad上,缩放比例也是2.0。 – occulus 2011-05-27 15:09:42
当然,但这与iPhone应用程序无关。 iPad应用程序不能以缩放模式运行。因此,如果您在iPhone应用程序中正确处理这种情况,则不是问题。 :) – jer 2011-05-27 15:28:30