Как я могу выбрать изображение из фотопленки, затем сохранить его в папке «Вспомогательные файлы» моего приложения, а затем выбрать имя сохраненного файла?

Я создаю игру для iOS на Objective-C, и часть этого - возможность открывать новые «корабли». Сейчас у меня их несколько, но мне нужна опция «индивидуальный корабль», когда пользователь выбирает изображение из своей камеры, а затем оно отображается как корабль в игре.

Итак, я хотел бы знать, как выбрать изображение (камера не нужна), а затем сохранить его в папке «Вспомогательные файлы» в приложении, чтобы игра могла его вызвать. Мне также нужно узнать имя файла, чтобы игра могла вызвать правильное изображение.

Любая помощь будет оценена.

я пытался

-(IBAction)chooseFromLibrary:(id)sender
{

UIImagePickerController *imagePickerController= [[UIImagePickerController alloc]init];
[imagePickerController setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];

// image picker needs a delegate so we can respond to its messages
[imagePickerController setDelegate:self];

// Place image picker on the screen
[self presentViewController:imagePickerController animated:YES completion:nil];

}

//delegate method will be called after picking photo either from camera or library
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[self dismissViewControllerAnimated:YES completion:nil];
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];

NSData *dataImage = [[NSData alloc] init];
dataImage = UIImagePNGRepresentation(image);
NSString *stringImage = [dataImage base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

stringImage = customImage;
}

Это слегка измененный код из ответа на this Сообщение на StackOverflow.

customImage - это строка, которая помещается в NSUserDefaults для ее сохранения, как показано здесь:

-(IBAction)enableCustom:(id)sender
{
NSString *playerSprite = customImage;
[[NSUserDefaults standardUserDefaults] setObject:playerSprite forKey:@"playerImage"];

NSString *playerImage = [[NSUserDefaults standardUserDefaults]
                         stringForKey:@"playerImage"];

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Wow you unlocked custom" message:@"Fail lol" delegate:self cancelButtonTitle:@"ur mean" otherButtonTitles:@"haha ur an more poor then mi", nil];
[alert show];
}

Итак, предупреждение работает нормально, но когда я пытаюсь поиграть в игру, вместо изображения отображается просто белое поле с большим красным крестиком на нем. Я не совсем уверен, что случилось.


person JustMe    schedule 20.03.2015    source источник
comment
Это слишком широко. Что ты пробовал? С какой частью у вас проблемы? Разбейте проблему на отдельные шаги.   -  person rmaddy    schedule 20.03.2015
comment
@rmaddy обновил пост с дополнительной информацией. Проблема в том, что изображение отображается неправильно, и я просто хотел переделать все как следует.   -  person JustMe    schedule 20.03.2015
comment
Первые две строки imagePickerController:didFinishPickingMedia: в порядке. Остальное отключено. Почему вы конвертируете данные PNG изображения в строку? Просто запишите данные в файл. Использование NSUserDefaults - плохая идея. Просто запишите изображение в файл.   -  person rmaddy    schedule 20.03.2015
comment
@rmaddy Вот в чем проблема. Понятия не имею, как это сделать. NSUserDefaults позволяет мне сохранить [вставьте имя изображения здесь] .png / jpeg / что угодно в файле plist, чтобы игра могла легко получить к нему доступ. Я не уверен, как записать изображение в файл, и тем более как вызвать его для игры.   -  person JustMe    schedule 20.03.2015
comment
См. stackoverflow.com/questions/28496019/   -  person rmaddy    schedule 20.03.2015
comment
@rmaddy Я вставил код, но когда приложение загружается, либо снова появляется белое поле с красным X, либо загружается корабль по умолчанию, как я сказал ему, если нечего загружать.   -  person JustMe    schedule 21.03.2015
comment
@rmaddy Я не совсем уверен, что случилось, но я закрыл Xcode, чтобы попрактиковаться на фортепиано, вернулся через час, и он работал с моими модификациями. Большое спасибо за помощь!   -  person JustMe    schedule 21.03.2015


Ответы (1)


Чтобы выбрать изображение и сохранить его в настраиваемой папке, используйте этот код:

-(IBAction)chooseFromLibrary:(id)sender
{

UIImagePickerController *imagePickerController= [[UIImagePickerController alloc]init];
[imagePickerController setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];

// image picker needs a delegate so we can respond to its messages
[imagePickerController setDelegate:self];

// Place image picker on the screen
[self presentViewController:imagePickerController animated:YES completion:nil];

}

//delegate methode will be called after picking photo either from camera or library
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{

[self dismissViewControllerAnimated:YES completion:NULL];

UIImage* image;

if([[info valueForKey:@"UIImagePickerControllerMediaType"] isEqualToString:@"public.image"])
{

    image = [info valueForKey:@"UIImagePickerControllerOriginalImage"];

    NSString *stringPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:@"custom"];

    // Custom Images is your folder name

    NSError *error = nil;

    if (![[NSFileManager defaultManager] fileExistsAtPath:stringPath])
        [[NSFileManager defaultManager] createDirectoryAtPath:stringPath withIntermediateDirectories:NO attributes:nil error:&error];

    NSString *fileName = [stringPath stringByAppendingFormat:@"/image.jpg"];

    NSData *data = UIImageJPEGRepresentation(image, 1.0);

    [data writeToFile:fileName atomically:YES];

    customImage = fileName;
}
}

customImage - это строковая переменная, которую я настроил как IBOutlet NSString в файле заголовка.

Затем в моем коде включения я помещаю строку customImage в NSUserDefaults, чтобы иметь к ней доступ в игре. Код также включает предупреждение с двумя кнопками.

-(IBAction)enableCustom:(id)sender
{
NSString *playerSprite = customImage;
[[NSUserDefaults standardUserDefaults] setObject:playerSprite forKey:@"playerImage"];

NSString *playerImage = [[NSUserDefaults standardUserDefaults]
                         stringForKey:@"playerImage"];

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Wow you unlocked custom" message:@"Fail lol" delegate:self cancelButtonTitle:@"ur mean" otherButtonTitles:@"haha ur an more poor then mi", nil];
[alert show];
}

Большое спасибо пользователю rmaddy за их помощь. Они направили меня к этому сообщению, если вы может это понадобится.

person JustMe    schedule 20.03.2015