Xcode 为 1x、2x、4" 2x 和 3x 资产提供了资产桶。我的全屏资产在这种配置下都很不稳定,因为 2x 桶用于 3.5" 和 4.7" 屏幕。目前我有一个 UIImage 类别来内省当前屏幕尺寸,如果设备看起来是 3.5”,则选择“*-3.5”资产。
这很笨重而且不酷。看到 Xcode 可以满足其 LaunchImage 资产的所有不同设备尺寸,我希望有某种方法可以为非启动图像资产提供特定于设备的资产,而无需借助代码。
Xcode 为 1x、2x、4" 2x 和 3x 资产提供了资产桶。我的全屏资产在这种配置下都很不稳定,因为 2x 桶用于 3.5" 和 4.7" 屏幕。目前我有一个 UIImage 类别来内省当前屏幕尺寸,如果设备看起来是 3.5”,则选择“*-3.5”资产。
这很笨重而且不酷。看到 Xcode 可以满足其 LaunchImage 资产的所有不同设备尺寸,我希望有某种方法可以为非启动图像资产提供特定于设备的资产,而无需借助代码。
自 2014 年 11 月中旬以来,我已经向 Apple 报告了一个关于此的错误,我只是注意到他们将其标记为无价值……这给我的印象是,Apple 故意省略了 iPhone 6 的额外插槽。我的猜测是他们现在希望将 2x 插槽用于 iPhone 6,也许他们正在减少对 iPhone 4s 的支持,因为它已经过时了。
如果你真的想继续支持 iPhone 4s,我建议在 2x 插槽中使用 iPhone 6 大小的图像,然后使用以下方法加载图像:
+(UIImage *)loadImageNamed:(NSString *)imageName
{
CGSize screenSize = [UIScreen mainScreen].bounds.size;
CGFloat screenHeight = MAX(screenSize.width, screenSize.height);
CGFloat const IPHONE_4_SCREEN_HEIGHT = 480;
UIImage *image = [UIImage imageNamed:imageName];
if(screenHeight == IPHONE_4_SCREEN_HEIGHT) {
CGFloat const xScale = .85333333;//x conversion ratio from iPhone 6's 375 pts width screen to iPhone 4's 320 pts width screen
CGFloat const yScale = .71964018;//y conversion ratio from iPhone 6's 667 pts height screen to iPhone 4's 480 pts height screen
CGSize newSize = CGSizeMake(xScale * image.size.width, yScale * image.size.height);
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0);
[image drawInRect:(CGRect){0, 0, newSize}];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resizedImage;
}
return image;
}
即使纵横比不同,将大图像 (iPhone 6) 调整为小图像 (iPhone 4) 也不会损失太多质量。
在迁移到 Xcode 6 和 iOS 8 时使用现有项目会产生一些初始问题。我通过将图像集从 更改为 解决了这个Device specific
问题Universal
。这将删除 R4 图像选项,并为您留下@1x
,@2x
和@3x
。例如,如果您使用需要适合屏幕的背景图像,那么我建议您找到不必 100% 完美适合看起来不错的图像,并将图像设置为显示为Aspect Fill
.
我有同样的问题,并得到了苹果的确认,我必须为此编写代码。例如,您可以像这样在 iPhone 6 上使用资产目录尝试全屏图像
但实际上我懒得用一个 2x 用于 4" & 4.7" 屏幕,另一个 2x 用于 3.5" 屏幕