Ответ 1
Правильно, imageNamed:
будет искать ваш основной пакет. Изображения в вашем проекте, даже если они находятся в разных группах в вашем Навигаторе проектов, будут в вашем основном пакете и могут быть доступны напрямую по имени.
Я добавил в свой проект папку .bundle, заполненную некоторыми изображениями. Правильно ли это относится к этому изображению, непосредственно пишу что-то вроде?:
[UIImage imageNamed:@"imageInBundle.png"];
Каков наилучший способ доступа и использования этих изображений?
Правильно, 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]
или быстро:
let image = UIImage(named: "image-name",
inBundle: NSBundle(forClass: self),
compatibleWithTraitCollection: nil)
Поскольку я должен был понять это для Свифта, подумал, что добавлю также...
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;
}
Быстрая версия
@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))