2013-07-18 18 views

Odpowiedz

38

Oto najprostszy sposób to zrobić (bez reimplementing UIImagePickerController). Najpierw użyj nakładki, aby pole kamery wyglądało na kwadratowe. Oto przykład dla 3,5" ekrany (trzeba by go zaktualizować do pracy dla 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]; 

Następnie, po uzyskać obraz z powrotem od UIImagePickerController, przycinać je do kwadratu z czymś takim :.

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

I skończysz

+0

Dzięki działa świetnie! Zastanawiam się, czy jest coś, co mogę zrobić, aby animacja otwierająca kamerę pojawiła się na wierzchu nakładki? – NSDavidObject

+0

Nie, niestety nie ma sposobu, aby zrobić to za pomocą publicznie udokumentowanych interfejsów API (tj. Bez robienia czegoś, co spowodowałoby odrzucenie aplikacji przez Apple). Jeśli chcesz to zrobić, musisz ponownie zaimplementować 'UIImagePickerController'. – Ander

+1

Co powinniśmy zmienić, aby działał zarówno na iPhone 5, jak i na poprzednich? –

4

@Anders odpowiedź była bardzo zbliżona do skorygowania za mną na iPhone 5. zrobiłem następującą modyfikację aby dodać nakładkę ustalony dla 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];` 

Mam nadzieję, że to pomoże komuś.

+6

Moje doświadczenia z tym na IOS7 na iPhone 5 nie były świetne. konkretnie mogłem zobaczyć nakładkę, ale nie mogłem użyć natywnej kontroli zoomu. w końcu, kiedy zrobiłem zdjęcie i pojawiły się przyciski "Ponów" i "Użyj zdjęcia", nie mogłem kliknąć żadnego przycisku. YMMV –

Powiązane problemy