Използване на UIImagePickerController в UIView

Имам бутон, който като щракна показва камерата (работи перфектно)

- (IBAction)getPhoto:(id)sender
{
    NSLog( @"Button clicked!" );
    imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
    }

    else {  // IF the device doesn't have a camera, so use the photos album
        [imagePicker setSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum];
    }

    [self addSubview:imagePicker.view];
}

След което мога да направя изображение и т.н. - Но когато щракна върху "използване": нищо не се случва, това е моят метод: инструментът за избор на изображение не се отхвърля сам: приложението просто не прави нищо, опитвам се да взема изображението, което просто взе и го покажете в CGRect на екрана.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    [picker dismissViewControllerAnimated:YES completion:NULL];

    UIImageView *patientImage = [[UIImageView alloc] init];
    patientImage.frame = CGRectMake(625, 25, 83, 103);

    UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
    self.patientImage.image = chosenImage;
}

Дори когато натисна бутона за отказ, без да направя изображение, imagePicker (интерфейс на камерата) не се отхвърля сам

Всяка помощ, съвет или насока ще бъдат много оценени.


person Taskinul Haque    schedule 21.06.2013    source източник
comment
пациентски образ.рамка = CGRectMake(625, 25, 83, 103); ето x е извън екрана на устройството :( така че не можете да видите изображение и също [picker dismissViewControllerAnimated:YES completion:NULL]; в края на метода   -  person Nitin Gohel    schedule 21.06.2013
comment
благодаря ти Nitin, но използвам ipad, така че е на екрана ми и се опитах да преместя dismissVieController, без успех   -  person Taskinul Haque    schedule 21.06.2013
comment
добавено ли е пациентско изображение към някой изглед? като [self addSubview:patientImage];   -  person Kuriakose Pious P    schedule 26.06.2013


Отговори (6)


Методът getPhoto: в подкласа UIView ли е?

Ако това е така, тогава би било по-добре да:

  1. Преместете изцяло кода getPhoto: извън подкласа UIView и го поставете в родителския контролер на изгледа.

  2. Направете своя UIButton свойство на вашия UIView: @property (nonatomic, strong) UIButton *myButton;

  3. Във вашия контролер за изглед задайте целта и действието на бутона, както следва:

    [myView.myButton addTarget:self action:@selector(getPhoto:) forControlEvents:UIControlEventTouchUpInside];
    
  4. И накрая, във вашия getPhoto: метод извикайте [self presentViewController:imagePicker animated:YES completion:NULL];

  5. Вашият - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info код също трябва да влезе в контролера за изглед, променяйки self.patientImage.image = chosenImage; на myView.patientImage.image = chosenImage;

person Vinny Coyne    schedule 23.06.2013
comment
Когато поставя ред 3 в метода viewdidload на класа ViewController, получавам грешка, че PicBtn не е намерен в обект от тип myView - но съм декларирал PicBtn като UIButton и като свойство в заглавката на моя UIView клас myView - person Taskinul Haque; 24.06.2013
comment
За тези, които също се интересуват от неговия въпрос, това, което @vinnyCoyne каза, беше правилното нещо. . . . но вместо да извиквате myView.myButton, първо трябва да създадете екземпляр на myView Class и след това да го извикате, като използвате името на променливата на екземпляра. Това реши проблема ми. . Благодаря ти - person Taskinul Haque; 04.07.2013

Не трябва да правите нещото „addSubview“ там горе, а вместо това направете:

[self presentViewController:imagePicker animated:YES completion:nil];
person Michael Dautermann    schedule 21.06.2013
comment
Проблемът е, че presentViewController е метод на UIViewController, имам нужда това приложение да работи в UIView, някаква идея? - person Taskinul Haque; 21.06.2013
comment
Един изглед не трябва да отговаря за представянето на друг контролер. Това противоречи на MVC, който е в основата на iOS. Трябва да имате контролер за изглед, който да направи това, както е предложено в този отговор. - person JRG-Developer; 28.06.2013

Вместо да добавяте инструмента за избор като подизглед, трябва да добавите инструмента за избор към UIPopoverController.

След това можете да го покажете от вашия UIView подклас, като използвате метода presentPopoverFromRect:inView:permittedArrowDirections:animated: popover по следния начин:

self.popover = [[UIPopoverController alloc] initWithContentViewController:imagePicker];
[self.popover presentPopoverFromRect:sender.frame inView:self permittedArrowDirections: UIPopoverArrowDirectionAny animated:YES];

След това можете да използвате методите на делегиране, за да отхвърлите изскачащия прозорец, като използвате:

[self.popover dismissPopoverAnimatedYES];

Изисква се от официалните документи:

Таблицата показва, че на iPad, ако посочите тип източник UIImagePickerControllerSourceTypePhotoLibrary или UIImagePickerControllerSourceTypeSavedPhotosAlbum, трябва да представите инструмента за избор на изображение с помощта на изскачащ контролер, както е описано в „Представяне и отхвърляне на изскачащия прозорец“ в Справочник за клас UIPopoverController. Ако се опитате да представите инструмент за избор на изображение модално (на цял екран) за избор между запазени снимки и филми, системата създава изключение.

На iPad, ако посочите тип източник UIImagePickerControllerSourceTypeCamera, можете да представите инструмента за избор на изображение модално (на цял екран) или като използвате изскачащ прозорец. Apple обаче препоръчва да представяте интерфейса на камерата само на цял екран.

person lnafziger    schedule 28.06.2013

Не знам защо бутонът за отказ не работи. Но направете тази промяна, тя ще избере изображението, върху което щраквате.

Ако искате събитие за отмяна, добавете го, като създадете персонализиран UIBarButtonи го добавете.

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

UIImageView *patientImage = [[UIImageView alloc] init];
patientImage.frame = CGRectMake(625, 25, 83, 103);

UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
self.patientImage.image = chosenImage;

[imagePicker.view removeFromSuperview];

}
person Arun    schedule 24.06.2013

Опитвам:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    [picker.view removeFromSuperview];

    UIImageView *patientImage = [[UIImageView alloc] init];
    patientImage.frame = CGRectMake(625, 25, 83, 103);

    UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
    self.patientImage.image = chosenImage;
}
person user754905    schedule 28.06.2013

Премахнете [self.addSubView:imagePicker.view]; и вместо това

[self presentViewController:imagePicker animated:YES completion:NULL];

Вие отхвърляте променливата picker, въпреки че picker е недефинирана. Вместо това поставете:

[self dismissModalViewControllerAnimated:YES completion:NULL]; и се уверете, че е в края на вашия метод.

person Milo    schedule 21.06.2013