#iphone #xcode #ios #uiimage
#iPhone #xcode #iOS #uiimage
Вопрос:
Я пытаюсь загрузить сохраненное изображение, но когда я проверяю UIImage, оно возвращается с нулевым значением. Вот код:
UIImage *img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"/var/mobile/Applications/B74FDA2B-5B8C-40AC-863C-4030AA85534B/Documents/70.jpg" ofType:nil]];
Затем я проверяю img, чтобы увидеть, равно ли оно нулю, и это так. В списке каталогов показан файл, что я делаю не так?
Ответ №1:
Вам нужно указать на каталог Documents в вашем приложении, затем вот так:
- (NSString *)applicationDocumentsDirectory
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
return basePath;
}
Использование:
UIImage *img = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/70.jpg",[self applicationDocumentsDirectory]]];
Ответ №2:
Во-первых, вы неправильно используете pathForResource, правильным способом было бы:
[[NSBundle mainBundle] pathForResource:@"70" ofType:@"jpg"]
Вся идея объединения заключается в том, чтобы абстрагировать путь к ресурсу таким образом, чтобы он всегда был действительным, независимо от того, где в системе находится ваше приложение. Но если все, что вы хотите сделать, это загрузить это изображение, я бы порекомендовал вам использовать imageNamed: поскольку он автоматически обрабатывает обнаружение отображения с разрешением retina (высокое разрешение) на iPhone для вас и загружает соответствующий ресурс «автоматически»:
UIImage *img = [UIImage imageNamed:@"70.jpg"];
Чтобы легко поддерживать обычное разрешение и разрешение retina, вам потребуется два ресурса в вашем пакете приложений, 70.jpg и 70@2x.jpg при этом ресурс @2x удвоился как по размеру, так и по высоте.
Комментарии:
1. Проблема с вашим решением заключается в том, что
UIImage
ищет jpg в пакете приложений, где-поскольку ему это нужно из каталога документов приложения.
Ответ №3:
Попробуйте загрузить UIImage с:
[UIImage imageNamed:@"something.png"]
Выполняется поиск изображения с указанным именем в основном пакете приложения. Также приятно: он автоматически выбирает сетчатку (xyz@2x.png ) или версии, отличной от Retina (xyz.png).
Комментарии:
1. У меня была проблема с изображениями сетчатки, и это решило мою проблему. Большое спасибо.
Ответ №4:
Ваш путь просто не будет работать, потому что ваше приложение находится в изолированной среде, и вы пытаетесь использовать полный путь.
Вместо этого вы должны использовать следующее:
UIImage *img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"70" ofType:@"jpg"]];
или вы можете использовать, но работает медленнее, чем вышеупомянутый:
UIImage *img = [UIImage imageNamed:@"70.jpg"];
Комментарии:
1. Спасибо за ответ, я попробовал оба из них и все еще получаю ноль, когда делаю: if (img == nil) {NSLog(@»равно нулю»);} Я начинаю задаваться вопросом, сохраняю ли я его неправильно.
2. Я вижу в своем каталоге Documents «70.jpg «существует. Это то, что вы имеете в виду, я немного запутался с «вашим пакетом». Еще раз спасибо.
3. Проверьте файлы вашего проекта, и вы также можете открыть файл .app, чтобы убедиться, что ресурс был скопирован. Скорее всего, файл не включен в ваш проект, если бы он был, то приведенный мной образец сработал бы.
4. Я снимаю изображение с камеры и сохраняю его в каталоге Documents.