Загружать изображения из комплекта с прошивкой
я добавил в свой проект a .bundle папка заполнена некоторыми изображениями.
Правильно ли ссылаться на это изображение напрямую, написав что-то вроде ?:
[UIImage imageNamed:@"imageInBundle.png"];
какой лучший способ доступа и использования этих изображений ?
10 ответов:
правильно,
imageNamed:будет искать ваш основной пакет. Изображения в вашем проекте, даже если они находятся в разных группах в вашем навигаторе проектов, будут находиться в вашем основном пакете и могут быть доступны непосредственно по имени.
Если это не сработает, попробуй
[UIImage imageNamed:@"yourbundlefile.bundle/imageInBundle.png"];лучшие
1) Если вы работаете с пакетами, перейдите к цели пакета и установите COMBINE_HIDPI_IMAGES в NO. В другом случае изображение будет преобразовано в формат tiff.
2) попробуйте этот код:
NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"YourBundle" withExtension:@"bundle"]]; NSString *imagePath = [bundle pathForResource:@"imageInBundle" ofType:@"png"]; UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
Apple, к счастью, предоставил правильный API для этого в iOS 8,
imageNamed:inBundle:compatibleWithTraitCollection:.он используется так:
[UIImage imageNamed:@"image-name" inBundle:[NSBundle bundleForClass:self.class] compatibleWithTraitCollection:nil]или в swift:
let image = UIImage(named: "image-name", inBundle: NSBundle(forClass: self), compatibleWithTraitCollection: nil)
Так как я должен был выяснить это для Swift, подумал, что я бы добавил также....
if let imagePath = NSBundle.mainBundle().pathForImageResource("TestImage.png") { imageView.image = NSImage(contentsOfFile: imagePath) }где у меня
TestImage.pngнаSupporting Filesгруппа внутри моего пакета.
этот метод возвращает изображение в любом месте проекта xcode:=>
+(UIImage*)returnImageFromResourceBundle:(NSString*)nameOfImage { NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Resource" ofType:@"bundle"]; NSString *imageString = [[NSBundle bundleWithPath:bundlePath] pathForResource:nameOfImage ofType:@"png"]; UIImage *retrievedImage = [[UIImage alloc] initWithContentsOfFile: imageString]; return retrievedImage; }
Swift версия
ответ @ AndrewMackenzie меня не устроил. Вот что получилось
let image = UIImage(named: "imageInBundle.png") imageView.image = imageмой полный ответ здесь.
быстрый способ сделать это, если вы собираетесь использовать его пару раз в том же файле ViewController:
получить изображение в любом месте в том же классе, что метод, приведенный ниже:
// this fetches the image from: MyBundle.bundle/folder/to/images/myImage.png UIImage *myImage = [self imageFromBundle:@"MyBundle" withPath:@"folder/to/images/myImage.png"];метод, который извлекает изображения:
- (UIImage *)imageFromBundle:(NSString *)bundleName withPath:(NSString *)imageName { NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:bundleName withExtension:@"bundle"]; NSBundle *bundle = [NSBundle bundleWithURL:bundleURL]; NSString *imagePath = [bundle pathForResource:imageName ofType:nil]; UIImage *image = [UIImage imageWithContentsOfFile:imagePath]; return image; }или просто назовите его прямо из пакета:
UIImage *myImage = [UIImage imageNamed:@"MyBundle.bundle/folder/to/images/myImage.png"];
Для Swift 3
let prettyImage = UIImage(named: "prettyImage", in: Bundle(for: self), compatibleWith: nil)
Swift 3
let myImage = UIImage(named: "nameOfImage", in: Bundle(for: type(of: self)), compatibleWith: nil)Я не могу получить текущий пакет, поэтому я делаю это:
Bundle(for: type(of: self))
Comments