iOS的图像资源
我可能在这里丢失了一些明显的东西,但是我一直无法解决以下问题:
我有一个正常和视网膜屏幕的图像资源项目,像someimage.png和someimage@2x.png ,这是存储在一个单独的包。 当我构build项目时,Xcode会自动将它们打包成一个多页的tiff( imageName.tiff
),我已经在finder中检查过它 – 它实际上是包含两个图像的multipage tiff。 然而,这里出现了一个问题:我很难加载适当的资源。
我所做的是:
NSString * imageName = ... ; NSLog(@"imageName: %@", imageName); UIImage * someImage = [UIImage imageNamed: imageName];
另外我fave辅助方法,返回捆绑资源:
+(NSBundle *) resourcesBundle { NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"MyResourcesBundle" withExtension:@"bundle"]]; return bundle; }
我已经尝试以下imageName
:
imageName = [[AuxClass resourcesBundle] pathForResource:@"someimage" ofType:@"png"];
在这种情况下,我对imageName
有null
。
imageName = [[AuxClass resourcesBundle] pathForResource:@"someimage" ofType:@"tiff"];
在这种情况下,执行图像path返回,但它只适用于,如果我使用imageWithContentsOfFile
而不是imageNamed
,并没有采取适当的资源:它加载视网膜资源,尽pipe屏幕的types。
如果我省略filetype(就像我在添加@2x
资源之前所做的一样,并且它工作正常,并且是我尝试的第一件事情,并确定它会起作用)
imageName = [NSString stringWithFormat: @"%@/%@", @"MyResourcesBundle.bundle"", @"someimage" ];
没有得到加载。
添加“.tiff”扩展名与pathForResource:
具有相同的效果pathForResource:
– 加载视网膜资源,忽略非视网膜屏幕的资源。
那么我错过了什么? 什么是加载图像的正确方法?
你有没有试图简单地加载图像使用:
UIImage * someImage = [UIImage imageNamed: @"someimage"];
(假设你的项目中有一个名为'someimage'的图片,例如someimage.png)
该代码将根据平台自动select视网膜/非视网膜版本。
如果问题是创build了TIFF,请检查:
在最新版本的XCode中,进入编辑器菜单,然后select“validation设置”,这应该删除该艺术品组合。
多页TIFF仅适用于OSX; 他们不在 iOS上工作 。
因此,您需要停止尝试访问本质上无法访问的资源,并以正确的方式执行操作!
您需要打开生成外部资源包的项目 ,select目标,转到生成设置,然后部署子标题,并将“合并高分辨率图稿”设置为否。然后重新编译外部资源包。
在你的主项目中,你现在应该能够以正常的方式阅读PNG。
如果你正在使用捆绑而不是去
– >build立设置 – > COMBINE_HIDPI_IMAGES为NO,
而你只需要清理和构build!
– >build立设置 – > COMBINE_HIDPI_IMAGES到NO
这是唯一可行的解决scheme,不需要其他更改
在为应用程序创build图像时,假设您正在创build一个名为example
的图像。
您应该保存以下内容:
- 例如〜iphone.png – >这是非视网膜iPhone
- 例如~iphone@2x.png – >这是视网膜iPhone
- 例如〜ipad.png – >这是非视网膜iPad
- 例如~ipad@2x.png – >这是iPad的视网膜
所以,从你调用它的地方来说并不重要,你可以这样调用它,假设myImageView是一个UIImageView对象:
[myImageView setImage:[UIImage imageNamed:@"example"]];
苹果强烈build议你使用PNG图像。 而且,OS负责为所需的设备find正确的图像。 你不必担心findpath和所有的东西。 +(UIImage*)imageNamed:(NSString*)name
在您的资源包中查找正确的图像 – 顺便说一句,只要调用[NSBundle mainBundle];
- 更新到Xcode 8后的错误:“没有这样的模块”和“目标覆盖EMBEDDED_CONTENT_CONTAINS_SWIFT”build立设置“
- UITableViewCell中的UIButton是Tappable(获取正确的事件)但问题是点击效果不可见
- 验证美国邮政编码(快速3)
- UICollectionViewData中的声明失败indexPathForItemAtGlobalIndex
- 是否有可能两次popupUINavigationController?
- KVO修改由NSMutableArray支持的NSArray的通知
- iOS 10中是否有新的设备标识符?
- IOS面试常见问题解答(2018年8月)第2部分
- NSString包含emojis时如何获得NSString的大小?