2013-07-18 16 views
15

Sto provando a creare una macchina fotografica come Instagram in cui l'utente può vedere una finestra e l'immagine verrà ritagliata in quella casella. Per qualche motivo la fotocamera non va fino in fondo allo schermo e si spegne verso la fine. Mi sto anche chiedendo come fare per ritagliare l'immagine per essere esattamente 320x320 all'interno di quella casella?iOS Custom UIImagePickerController Camera Crop to Square

enter image description here

risposta

38

Ecco il modo più semplice per farlo (senza reimplementare UIImagePickerController). Innanzitutto, utilizzare una sovrapposizione per rendere quadrato il campo della telecamera. Ecco un esempio per schermo di 3,5" (avresti bisogno di aggiornarlo a lavorare per iPhone 5):

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; 
imagePickerController.sourceType = source; 

if (source == UIImagePickerControllerSourceTypeCamera) { 
    //Create camera overlay 
    CGRect f = imagePickerController.view.bounds; 
    f.size.height -= imagePickerController.navigationBar.bounds.size.height; 
    CGFloat barHeight = (f.size.height - f.size.width)/2; 
    UIGraphicsBeginImageContext(f.size); 
    [[UIColor colorWithWhite:0 alpha:.5] set]; 
    UIRectFillUsingBlendMode(CGRectMake(0, 0, f.size.width, barHeight), kCGBlendModeNormal); 
    UIRectFillUsingBlendMode(CGRectMake(0, f.size.height - barHeight, f.size.width, barHeight), kCGBlendModeNormal); 
    UIImage *overlayImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    UIImageView *overlayIV = [[UIImageView alloc] initWithFrame:f]; 
    overlayIV.image = overlayImage; 
    [imagePickerController.cameraOverlayView addSubview:overlayIV]; 
} 

imagePickerController.delegate = self; 
[self presentViewController:imagePickerController animated:YES completion:nil]; 

Poi, dopo aver ottenuto un immagine indietro dal UIImagePickerController, raccolto a una piazza con qualcosa di simile :.

//Crop the image to a square 
CGSize imageSize = image.size; 
CGFloat width = imageSize.width; 
CGFloat height = imageSize.height; 
if (width != height) { 
    CGFloat newDimension = MIN(width, height); 
    CGFloat widthOffset = (width - newDimension)/2; 
    CGFloat heightOffset = (height - newDimension)/2; 
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(newDimension, newDimension), NO, 0.); 
    [image drawAtPoint:CGPointMake(-widthOffset, -heightOffset) 
        blendMode:kCGBlendModeCopy 
         alpha:1.]; 
    image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
} 

E il gioco è fatto

+0

Grazie funziona alla grande! Mi stavo chiedendo se è possibile comunque che l'animazione di apertura della videocamera vada sopra l'overlay? – NSDavidObject

+0

No, sfortunatamente non c'è modo di farlo usando API pubblicamente documentate (cioè senza fare qualcosa che potrebbe far sì che Apple respinga l'App). Se si volesse fare ciò correttamente, sarebbe necessario reimplementare 'UIImagePickerController'. – Ander

+1

Cosa dovremmo cambiare per farlo funzionare su iPhone 5 e su iPhone precedenti? –

4

@Anders risposta è stata molto vicina a correggere per me su iPhone 5. ho fatto la seguente modifica per aggiungere una sovrapposizione hardcoded per iPhone 5:

CGRect f = imagePickerController.view.bounds; 
f.size.height -= imagePickerController.navigationBar.bounds.size.height; 
UIGraphicsBeginImageContext(f.size); 
[[UIColor colorWithWhite:0 alpha:.5] set]; 
UIRectFillUsingBlendMode(CGRectMake(0, 0, f.size.width, 124.0), kCGBlendModeNormal); 
UIRectFillUsingBlendMode(CGRectMake(0, 444, f.size.width, 52), kCGBlendModeNormal); 
UIImage *overlayImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

UIImageView *overlayIV = [[UIImageView alloc] initWithFrame:f]; 
overlayIV.image = overlayImage; 
overlayIV.alpha = 0.7f; 
[imagePickerController setCameraOverlayView:overlayIV];` 

Spero che questo aiuti qualcuno.

+6

La mia esperienza con questo su IOS7 su un iPhone 5 non era eccezionale. in particolare, ho potuto vedere l'overlay, ma non ho potuto usare i controlli di zoom nativi. infine, quando ho scattato la foto, i pulsanti "Retake" e "Use Photo" sono apparsi, non sono stato in grado di fare clic su nessuno dei due pulsanti. YMMV –