2013-12-15 17 views
9

Tôi biết điều này đã được hỏi một số thời gian nhưng tôi không thể tìm thấy câu trả lời.Sử dụng cameraOverlayView với UIImagePickerController

Tôi có một ứng dụng sử dụng UIImagePickerController để chụp ảnh. Vấn đề là tôi chỉ muốn lựa chọn máy ảnh có sẵn và tôi hiểu rằng tôi cần phải che giấu các điều khiển tiêu chuẩn:

cameraUI.showsCameraControls=NO; 

và sử dụng một cameraOverlayView để cung cấp các điều khiển của riêng tôi. Tôi đã xem dự án PhotoPicker của Apple rồi và vấn đề ban đầu của tôi là làm cách nào để nhận đối tượng Overlay vào bảng phân cảnh của tôi? Tôi không thể tìm thấy một vật như vậy trong thư viện. Bất kỳ sự giúp đỡ nào cũng biết ơn.

Trả lời

14

Đây là mã:

toolBar=[[UIToolbar alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height-54, self.view.frame.size.width, 55)]; 

toolBar.barStyle = UIBarStyleBlackOpaque; 
NSArray *items=[NSArray arrayWithObjects: 
       [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelPicture)], 
       [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], 
       [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(shootPicture)], 
       [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], 
       [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], 
       nil]; 
[toolBar setItems:items]; 

// create the overlay view 
overlayView = [[OverlayView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height-44)]; 

// important - it needs to be transparent so the camera preview shows through! 
overlayView.opaque=NO; 
overlayView.backgroundColor=[UIColor clearColor]; 

// parent view for our overlay 
UIView *cameraView=[[UIView alloc] initWithFrame:self.view.bounds]; 
[cameraView addSubview:overlayView]; 
[cameraView addSubview:toolBar]; 

imagePickerController = [[UIImagePickerController alloc] init]; 

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO){ 
    NSLog(@"Camera not available"); 
    return; 
} 
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera; 
imagePickerController.delegate = self; 

// hide the camera controls 
imagePickerController.showsCameraControls=NO; 
imagePickerController.wantsFullScreenLayout = YES; 
[imagePickerController setCameraOverlayView:cameraView]; 

[self presentViewController:imagePickerController animated:YES completion:nil]; 

Khai báo này trong tập tin tiêu đề của bạn:

UIImagePickerController * imagePickerController; 
UIToolbar *toolBar; 
OverlayView *overlayView; 

Thêm OverlayView.h và .m Lớp này từ Táo PhotoPicker.

Actions để chụp ảnh bằng nút camera tùy chỉnh:

-(void) shootPicture { 
    [imagePickerController takePicture]; 
} 

- (IBAction)cancelPicture { 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

Output sẽ đến như hình dưới đây kèm theo này (tôi đã thêm một nút chụp và nút hủy theo quan điểm của lớp phủ tùy chỉnh):

enter image description here

Happy Coding :)

+1

Bạn có thể cho một số chi tiết về nơi lớp OverlayView này đến từ đâu? –

+0

Tôi nghĩ lớp OverlayView chỉ là một UIView khác? – cdub

1

Đây là mã của tôi. Nếu bạn muốn máy ảnh xuất hiện ngay khi bộ điều khiển xem mở ra, hãy đảm bảo bạn khởi tạo UIImagePickerController trong viewDidAppear như tôi đã làm (viewDidLoad không hoạt động).

@interface CameraViewController() 
@property UIImagePickerController *PickerController; 
@property CGFloat HeightOfButtons; 
@end 


- (UIView *)createCustomOverlayView 
{ 

    // Main overlay view created 
    UIView *main_overlay_view = [[UIView alloc] initWithFrame:self.view.bounds]; 

    // Clear view (live camera feed) created and added to main overlay view 
    // ------------------------------------------------------------------------ 
    UIView *clear_view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - self.HeightOfButtons)]; 
    clear_view.opaque = NO; 
    clear_view.backgroundColor = [UIColor clearColor]; 
    [main_overlay_view addSubview:clear_view]; 
    // ------------------------------------------------------------------------ 


    // Creates two red buttons on the bottom of the view (on top of the live camera feed) 
    // Then adds the buttons to the main overlay view 
    // You can, of course, customize these buttons however you want 
    // ------------------------------------------------------------------------ 
    for(int i = 0; i < 2; i++) { 
     self.HeightOfButtons = 100; 
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
     // when a button is touched, UIImagePickerController snaps a picture 
     [button addTarget:self action:@selector(testIfButtonResponds) forControlEvents:UIControlEventTouchUpInside]; 
     button.frame = CGRectMake(i * self.view.frame.size.width/2, self.view.frame.size.height - self.HeightOfButtons, self.view.frame.size.width/2, self.HeightOfButtons); 
     [button setBackgroundColor:[UIColor redColor]]; 
     [main_overlay_view addSubview:button]; 
    } 
    // ------------------------------------------------------------------------ 

    return main_overlay_view; 
} 

- (void)makeCustomCameraAppear 
{ 
    self.PickerController = [[UIImagePickerController alloc] init]; 
    self.PickerController.sourceType = UIImagePickerControllerSourceTypeCamera; 
    self.PickerController.showsCameraControls = NO; 
    self.PickerController.delegate = self; 

    UIView *overlay_view = [self createCustomOverlayView]; 
    [self.PickerController setCameraOverlayView:overlay_view]; 

    [self presentViewController:self.PickerController animated:YES completion:NULL]; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [self makeCustomCameraAppear]; 
} 
0

thông tin tuyệt vời. Để thêm một chút với những gì đã làm Raghu:

lên top:

UIImagePicker *_imagePicker; 

//inside your take a picture method 
UIToolbar *toolBar=[[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 100)]; 
toolBar.barStyle = UIBarStyleBlackOpaque; 
NSArray *items=[NSArray arrayWithObjects: 
       [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelPicker)], 
       [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], 
       [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(shootPicture)], 
       [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], 
       [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], 
       nil]; 
[toolBar setItems:items]; 
toolBar.backgroundColor=[UIColor blackColor]; 



UIImageView *tp=[[UIImageView alloc]initWithFrame:CGRectMake(0, self.view.frame.size.height-100, self.view.frame.size.width, 100)]; 

tp.userInteractionEnabled=YES; 
tp.backgroundColor=[UIColor blackColor]; 

[tp addSubview:toolBar]; //add the toolbar to the uiimageview 

_imagePicker=[[UIImagePickerController alloc]init]; 
_imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera; 
_imagePicker.delegate = self; 
_imagePicker.showsCameraControls=NO; //we will make custom controls. 
[_imagePicker.view addSubview:tp]; 



-(void)cancelPicker{ 
//get rid of the image picker 
[self dismissViewControllerAnimated:YES completion:nil]; //dismiss uiimagepicker 
_imagePicker=nil; 
} 

//take the picture, it will then go directly to - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info method 
-(void)shootPicture{ 
[_imagePicker takePicture]; 
} 
Các vấn đề liên quan