0

  我正在使用 Xcode 4.5.2,该应用程序的目标是 iOS 6.0。在我的应用程序中,我无法显示 iPad Retina 图像。我知道我必须使用 @2x~ipad.png 扩展名才能让它们正确显示,我这样做了。我的图像是根据命名的,因此除了每个设备的扩展名之外,它们的名称都相同。这是我命名它的方式。

在此处输入图像描述

然而,

 NSString *name=@"appearanceConnection.png";
 //NSString *name=@"appearanceConnection"; //I did check this
 //I did check the target
 UIImage *image = [UIImage imageNamed:name];
 NSLog(@"%f",image.size.width);

显示@1x 图像的宽度。

如果我尝试手动设置正确的图像名称:

  if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
            ([UIScreen mainScreen].scale == 2.0)) {
            // Retina display
            name=@"appearanceConnection@2x~ipad.png";

            NSLog(@"retina");
        }
        else
        {
            name=@"appearanceConnection.png";
            NSLog(@"non-retina");
        }
     UIImage *image = [UIImage imageNamed:name];
     NSLog(@"%f",image.size.width);

选择正确的@2x,然后在我将其添加到视图时将其缩放 2.0。

我多次清理/重建我的项目,我重置了 IOS 模拟器设置,没有结果。
我究竟做错了什么?

更新:
非视网膜

在此处输入图像描述

视网膜:

NSLog(@"%f", image.scale)

afterimageNamed方法给了我 1.0

在此处输入图像描述

更新 2: 我正在尝试优化我的动画外观,所以我想加载一张大图像并按帧剪切。首先,我加载大图像(@2x 或 1@x),然后使用循环

for (int i = 0; i<numberOfFrames; i++)
    {
        CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage,
                                                           CGRectMake(i*width, 0.0f, width, height));
        UIImage *animationImage = [UIImage imageWithCGImage:imageRef];

        if (isFlip)
        {
            [animationImages insertObject:animationImage atIndex:0];
        }
        else
        {
            [animationImages addObject:animationImage];
        }

        CGImageRelease(imageRef);
    }

我剪切了这个大图像并创建了动画。如果是视网膜显示,则宽度和高度乘以 2。

也许这是一个警告?

UIImage *animationImage = [UIImage imageWithCGImage:imageRef];

返回我缩放两次的图像?

但是,如果我缩放 (0.5,0.5) UIImageView 这是由这个图像初始化它适合。知道为什么要缩放两次吗?

4

1 回答 1

3

当用作 UIImage 或类似的东西时,视网膜和非视网膜图像将具有相同的宽度和高度,将其视为在视网膜显示图像的 DPI 加倍,而不是宽度或高度。

这是为了在为视网膜和非视网膜编码时保持透明。

于 2013-03-26T09:27:41.067 回答