2013-07-18 5 views

Antwort

38

Hier ist der einfachste Weg, es zu tun (ohne UIImagePickerController Neuimplementierung). Verwenden Sie zuerst ein Overlay, um das Kamerafeld quadratisch zu machen. Hier ist ein Beispiel für 3,5" Display (müssen Sie sie aktualisieren arbeiten für 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]; 

Dann, nachdem Sie ein Bild zurück vom UIImagePickerController bekommen, Ernte es zu einem Platz mit so etwas wie diesem :.

//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(); 
} 

und fertig

+0

Danke funktioniert super! Ich frage mich, ob es überhaupt möglich ist, dass die Kamera-Eröffnungs-Animation über das Overlay geht? – NSDavidObject

+0

Nein, leider gibt es keine Möglichkeit, dies mit öffentlich dokumentierten APIs zu tun (d. H. Ohne etwas zu tun, das Apple dazu veranlassen würde, die App abzulehnen). Wenn Sie dies richtig machen möchten, müssen Sie 'UIImagePickerController' neu implementieren. – Ander

+1

Was sollten wir ändern, damit es sowohl auf dem iPhone 5 als auch auf früheren iPhones funktioniert? –

4

@Anders Antwort war ganz in der Nähe für mich auf dem iPhone 5. ich habe die folgende Änderung korrigieren ein Overlay für iPhone 5 fest einprogrammiert hinzuzufügen:

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];` 

Ich hoffe, das hilft jemandem.

+6

Meine Erfahrung mit diesem auf IOS7 auf einem iPhone 5 war nicht großartig. Insbesondere konnte ich das Overlay sehen, aber ich konnte die nativen Zoom-Steuerelemente nicht verwenden. Schließlich, als ich das Foto gemacht habe und die "Retake" und "Use Photo" Tasten erschienen sind, konnte ich keinen der beiden Buttons anklicken. YMMV –