【问题标题】:iOS 6.1 XCode 4.6 - imageNamed never return @2x versioniOS 6.1 XCode 4.6 - imageNamed 永远不会返回 @2x 版本
【发布时间】:2013-04-23 18:37:30
【问题描述】:

文件“flipImage.png”和“flipImage@2x.png”都在项目中。在 -[FlipsideViewController viewDidLoad] 我有以下代码。健全性检查(感谢其他 stackoverflowers)正确报告视网膜或否。但无论哪种情况,加载的图像都是小图像,由其高度验证。为什么没有自动加载适当的图像?好的,我可以看到解决方法,但我想尽可能使用系统。

UIImage* flipimage = [UIImage imageNamed:@"flipImage.png"];
NSLog(@"Image height = %f", flipimage.size.height);  // always 416, never 832 :(

// Sanity check.
if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
([UIScreen mainScreen].scale == 2.0)) {
    NSLog(@"Retina");
} else {
    NSLog(@"Non-retina");
}   

【问题讨论】:

    标签: ios ios-universal-app imagenamed


    【解决方案1】:

    根据之前的 cmets... 并且无需大量更改代码,您为什么不这样做:

    UIImage* flipimage = [UIImage imageNamed:@"flipImage.png"];
    NSLog(@"Image height = %f", flipimage.size.height * [UIScreen mainScreen].scale);
    

    这应该返回您的大小(点数 * 每点的像素数)。

    【讨论】:

      【解决方案2】:

      iOS 视网膜显示器不能这样工作。 @2x 图像和标准分辨率图像的高度在设备和您的代码中是相同的。当您在屏幕上创建 416 点 x 416 点的图像时,它不会仅仅因为它是在视网膜显示器上而不是在非视网膜显示器上而改变高度。

      不同之处在于@2x 图像具有更高的分辨率,因此它们在每个上显示更多像素,这是视网膜显示器使用的而不是像素。

      因此,基本上,您所需要做的就是为您在应用程序中使用的任何图像使用标准分辨率文件名,如果它在视网膜显示器上,操作系统会自动将其替换为更高分辨率的图像。

      【讨论】:

      • 谢谢,显然检查图像的“大小”并没有正确告诉我加载了哪个文件。事实上,正确的事情已经完成。我需要更多地研究不断发展的模型以及逻辑大小(像素)和显示大小(点?)之间的区别。这一切都让人想起纵横比的斗争,我曾经在andrewduncan.ws/aspect 的史诗咆哮中整理过。毛茸茸的!
      • @AndrewDuncan 实际上,一旦将图像加载到UIImage 中,无论检查大小等,您都无法真正知道哪个文件用于实例化它。如果我的回答对您有帮助,请检查它旁边的复选标记,这样它就会关闭这个问题。
      • 如果你想知道物理点的大小而不是逻辑点的大小,你可以询问 UIImage 中引用的 CGImage。 UIImage 只是 CGImage 的一个包装器。你也可以向 UIImage 询问他的比例,如果你提供了一个等于 2 的 @2x 图像,通常在视网膜显示中。
      猜你喜欢
      • 2019-11-15
      • 2011-07-25
      • 1970-01-01
      • 2012-10-02
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多