Загрузка файла пера после завершения с использованием UIImagePickerController - PullRequest
0 голосов
/ 13 июля 2011

Я хотел бы знать, как я могу загрузить новый файл пера после окончания работы с UIImagePicker Controller. Поэтому после того, как пользователь делает снимок с камеры или из альбомов, я хотел бы загрузить новый кончик, чтобы пользователь мог выполнить какое-либо редактирование. Ниже приводится didFinishPickingMediaWithInfo. Я могу загрузить изображение в текущий UIImageView или даже отправить и просмотреть оповещения, но даже если я попытался загрузить новый наконечник, он просто возвращается к наконечнику currentview без ошибок. Имейте в виду, что я полный ios noob, поэтому, если метод используется неправильно, пожалуйста, дайте мне знать Заранее спасибо.

p.s. Просто чтобы добавить, даже если мне удастся загрузить новый перо, как мне передать информацию из предыдущего перья? Например. если я выберу изображение из nib2, как передать его в nib3?

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info   {
imageOverlay.image = [UIImage imageNamed:@"mask_overlay1.png"];
[imageOverlay release];

// Displaying image to the imageView
imageView.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

// Tried to load a new nib
UIView *currentView = self.view;

// Get the underlying UIWindow, or the view containing the current view.
UIView *theWindow = [currentView superview];


//remove the current view and replace with myView1
[currentView removeFromSuperview];

// set up an animation for the transition between the views
CATransition *animation = [CATransition animation];
[animation setDuration:0.5];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromLeft];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];

[[theWindow layer] addAnimation:animation forKey:@"createPhotoView"];

}

1 Ответ

0 голосов
/ 13 июля 2011

Я понятия не имею, на что похож рабочий процесс вашего приложения, но если вам нужно отобразить новый вид после того, как выбрано изображение, вам, вероятно, следует сделать это либо путем добавления нового контроллера представления на контроллер навигации, либо путем представления это как модальный вид. Это позволяет вам легко вернуться к предыдущему экрану, где вас попросили выбрать фотографию.

Допустим, что для вашего приложения вы решили использовать UINavigationController.

Вы бы инициализировали контроллер навигации с вашим первым контроллером представления в качестве корневого контроллера представления.

Тогда в вашем методе делегата UIImagePicker вы получите что-то вроде этого:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    // Initialize your new view controller
    CustomViewController *controller = [[CustomViewController alloc] initWithNibName:@"SecondView" bundle:nil];

    // Pass your custom view controller the image you just selected
    controller.valueToPass = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

    [self.navigationController pushViewController:controller animated:YES];

    [controller release];

}

Вы создаете подкласс UIViewController с именем CustomViewController и передаете ему значения, создавая свойства, которые вы можете назначить (например, valueToPass в моем примере).

EDIT:

Можно просто переключить видимый вид контроллера вида. Это так же просто, как изменить значение self.view. Вы можете поместить два UIViews в один файл XIB и поместить IBOutlets для обоих в ваш контроллер. Вы могли бы иметь заголовок, который выглядит так:

@interface MyController : UIViewController {

    IBOutlet UIView *view1;

    IBOutlet UIView *view2;

}

// Follow this with properties for all of those IBOutlets as well

Тогда в коде вашего контроллера:

- (IBAction)switchViews {

    if ([self.view isEqualTo:view1]) {
        self.view = view2;
    } else {
        self.view = view1;
    }

}

Это работает, но, насколько я знаю, не разрешает переходы. Вместо этого вы можете сделать это:

- (IBAction)switchViews:(id)sender {

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:NO];

    if ([[secondaryView superview] isEqual:mainView]) {
        [secondaryView removeFromSuperview];
    } else {
        [self.view addSubview:secondaryView];
    }

    [UIView commitAnimations];

}

Обе эти опции работают и позволяют вам использовать один и тот же контроллер вида для управления обоими видами. Однако, если представления выполняют разные задачи, они должны быть связаны с разными контроллерами. Использование разных контроллеров аналогично, если вы устанавливаете контроллер как свойство в своем заголовке:

- (IBAction)switchViews:(id)sender {

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:NO];

    if (self.secondaryController) {
        [self.secondaryController.view removeFromSuperview];
        self.secondaryController = nil;
    } else {
        self.secondaryController = [[SecondaryController alloc] initWithNibName:@"SecondView" bundle:nil];
        self.secondaryController.valueToPass = @"I am passing this value!";
        [self.view addSubview:self.secondaryController.view];
    }

    [UIView commitAnimations];

}
...