2011-12-16 17 views

Respuesta

14

Esto se puede hacer a través de las siguientes líneas:

- (void) navigationController: (UINavigationController *) navigationController willShowViewController: (UIViewController *) viewController animated: (BOOL) animated { 
    if (imagePickerController.sourceType == UIImagePickerControllerSourceTypePhotoLibrary) { 
     UIBarButtonItem* button = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(showCamera:)]; 
     viewController.navigationItem.rightBarButtonItems = [NSArray arrayWithObject:button]; 
    } else { 
     UIBarButtonItem* button = [[UIBarButtonItem alloc] initWithTitle:@"Library" style:UIBarButtonItemStylePlain target:self action:@selector(showLibrary:)]; 
     viewController.navigationItem.leftBarButtonItems = [NSArray arrayWithObject:button]; 
     viewController.navigationItem.title = @"Take Photo"; 
     viewController.navigationController.navigationBarHidden = NO; // important 
    } 
} 

- (void) showCamera: (id) sender { 
    imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera; 
} 

- (void) showLibrary: (id) sender { 
    imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
} 
+2

Esto no cambiará el control de la cámara, sino que agregará una barra de navegación en la parte superior de la ventana de la cámara. Eso podría o no ser lo que quieres, pero no creo que sea lo que el OP tenía en mente. – DaGaMs

+2

gran solución. Solo recuerde verificar si la fuente de la cámara está realmente disponible. Algo como: if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) { self.picker.sourceType = UIImagePickerControllerSourceTypeCamera; } – EsbenB

3

Aquí es una aplicación de ejemplo y biblioteca muy simple que le permite obtener la foto de tomar o elegir de la biblioteca al igual que Facebook lo hace. https://github.com/fulldecent/FDTake

1

He hecho esto modificando la aplicación de ejemplo PhotoPicker de Apple. He eliminado todos los controles de la cámara y he añadido mi propio botón. Cuando se hace clic en él, UIImagePickerControllerSourceType se establece en UIImagePickerControllerSourceTypePhotoLibrary.

La parte difícil para mí fue "descartar" (podría ser técnicamente la palabra incorrecta) la Biblioteca de fotos después de que se eligió la imagen. Lo hice estableciendo el tipo de fuente de nuevo a UIImagePickerControllerSourceTypeCamera. Esto devuelve la vista de superposición de la cámara.

ViewController.h 

#import <UIKit/UIKit.h> 
#import <CoreGraphics/CoreGraphics.h> 
#import <ImageIO/ImageIO.h> 


@interface ViewController : UIViewController <UIImagePickerControllerDelegate> { 

// 

} 

@property (nonatomic, strong) UIImagePickerController *imagePicker; 
- (IBAction)uploadNewPhotoTapped:(id)sender; 
@end 


ViewController.m 

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

//Other code 

- (IBAction)uploadNewPhotoTapped:(id)sender { 

    UIImagePickerController *imagePickController=[[UIImagePickerController alloc]init]; 
    //You can use isSourceTypeAvailable to check 

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
    { 
     imagePickController.sourceType=UIImagePickerControllerSourceTypeCamera; 
     imagePickController.showsCameraControls=YES; 
     // self.usingPopover = NO; 
    } 
    else if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {//Check PhotoLibrary available or not 
     imagePickController.sourceType=UIImagePickerControllerSourceTypePhotoLibrary; 
     imagePickController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
    } 
    else if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) //Check front Camera available or not 
     imagePickController.sourceType=UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
    //else //!!!!!!!!!!!exception 

    imagePickController.delegate=self; 
    imagePickController.allowsEditing=NO; 

    [self presentModalViewController:imagePickController animated:YES]; 
} 


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

    UIImage *originalImage=[info objectForKey:UIImagePickerControllerOriginalImage]; 

    //Do whatever with your image 
    NSData *data = UIImageJPEGRepresentation (
              originalImage, 
              1.0 
             ); 

    [self dismissModalViewControllerAnimated:YES]; 
} 

    // Other code 
    @end 
+0

Perdón por despertar a un zombi aquí, pero si todavía tienes tu código, ¡estaría realmente interesado! – bdv

+0

Hola bdv. De hecho, desenterré mi código y lo publiqué en mi respuesta original. No recuerdo exactamente cómo lo hice, ya que no he trabajado en esta aplicación en 2 años, pero comencé con la aplicación PhotoPicker original de Apple. https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html – ganime

1

versión Swift2 de código @epsilontik:

//mediaPicker is your UIImagePickerController 
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { 
    if(mediaPicker.sourceType == UIImagePickerControllerSourceType.PhotoLibrary){ 
     let button = UIBarButtonItem(title: "Take picture", style: UIBarButtonItemStyle.Plain, target: self, action: "showCamera") 
     viewController.navigationItem.rightBarButtonItem = button 
    }else{ 
     let button = UIBarButtonItem(title: "Choose picture", style: UIBarButtonItemStyle.Plain, target: self, action: "choosePicture") 
     viewController.navigationItem.rightBarButtonItem = button 
     viewController.navigationController?.navigationBarHidden = false 
     viewController.navigationController?.navigationBar.translucent = true 
    } 
} 

func showCamera(){ 
    mediaPicker.sourceType = UIImagePickerControllerSourceType.Camera 
} 

func choosePicture(){ 
    mediaPicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary 
} 
Cuestiones relacionadas