2013-03-13 16 views
13

Làm cách nào để buộc bộ điều khiển UIImagePickerController chỉ ghi video ở chế độ ngang?UIImagePickerĐiều khiển quay video với hướng ngang

Tôi biết rằng lớp này nên được sử dụng để ghi hình chân dung, nhưng tôi cần phải có nó trong cảnh quan.

Đã tìm thấy một số câu hỏi tương tự nhưng không có giải pháp nào phù hợp với tôi (iOS 6.1).

Ví dụ quan sát hướng thiết bị không làm việc cho tôi (điều này answer- https://stackoverflow.com/a/2147584/775779)

Nếu tôi thực hiện UIImagePickerController loại như sau:

#import "UIImagePickerController+NonRotating.h" 

@implementation UIImagePickerController (NonRotating) 

- (BOOL)shouldAutorotate 
{ 

    return YES; 
} 

-(NSUInteger)supportedInterfaceOrientations 

{ 
    return UIInterfaceOrientationMaskLandscape; 

} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationLandscapeRight; 
} 

@end 

nó gần như làm việc, nhưng tôi thấy một số hành vi lạ của một số điều khiển và định hướng video sai trong quá trình ghi (video kết quả là ok).

1) Bắt đầu. Nút hủy và ghi ở đúng vị trí, nhưng các điều khiển khác sai. Và video được xoay. enter image description here

2) Ghi âm. Bộ hẹn giờ và video sai. enter image description here

3) Ghi xong. tất cả đều tốt! và video kết quả là đúng.

enter image description here

bạn có ý tưởng nào không?

CẬP NHẬT Tôi cần khóa màn hình theo hướng ngang trong quá trình ghi.

+3

vui lòng không đóng câu hỏi này. câu hỏi mà bạn đưa ra liên kết không có câu trả lời đúng và tất cả các giải pháp từ nhận xét đó không hoạt động. –

+0

@iPatel bạn đã đọc câu hỏi của tôi chưa? Tôi đã nói về liên kết này. –

+0

bạn đã thử đặt hướng video chưa? http://stackoverflow.com/questions/14811641/ios-camera-orientation#14812010 – Gotschi

Trả lời

0

thử này trên có thể nó w'll giúp bạn

- (BOOL)shouldAutorotate 
{ 
return NO; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
return UIInterfaceOrientationLandscapeRight | UIInterfaceOrientationLandscapeLeft; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
return UIInterfaceOrientationLandscapeRight; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight ||  interfaceOrientation == UIInterfaceOrientationLandscapeLeft); 
} 

nó w'lll làm việc ... :)

+0

cảm ơn cho bình luận đã thử nó ra, nhưng đã có một ngoại lệ: *** Chấm dứt ứng dụng do vô tình ngoại lệ 'UIApplicationInvalidInterfaceOrientation', lý do: 'preferredInterfaceOrientationForPresentation phải trả về một định hướng giao diện hỗ trợ!' –

+0

phiên bản xcode ru sử dụng ??? – Kalyani

+0

Version 4.6 (4H127) –

3

Bạn cần phải thực hiện một phong tục UIImagePickerController. Để làm điều đó, bạn sẽ cần đặt thuộc tính của trình tạo ảnh showsCameraControls thành FALSE.

self.mImagePickerController.showsCameraControls = NO; 
self.mImagePickerController.wantsFullScreenLayout = YES; 

Khi bạn thực hiện việc này, không có điều khiển mặc định nào hiển thị cho bạn. Bạn sẽ cần phải thiết lập các nút tùy chỉnh cho khởi động/dừng ghi âm và lật máy ảnh, vv

Bây giờ, bạn có thể sử dụng start/stop phương pháp để quay video:

Khi một nhấp chuột vào ghi âm bắt đầu,

[self.mImagePickerController startVideoCapture]; 

Để dừng lại,

[self.mImagePickerController stopVideoCapture]; 

Để theo dõi các chuyển đổi giữa máy ảnh, bạn có thể sử dụng một lá cờ

if (self.mImagePickerController.cameraDevice == UIImagePickerControllerCameraDeviceRear) 
    { 
     self.mImagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceFront; 
     isFrontCamera = YES; 
    } 
    else 
    { 
     self.mImagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceRear; 
     isFrontCamera = NO; 
    } 

Bạn có thể đặt các điều khiển theo ý muốn về thay đổi hướng. AppDelegate.m

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

Đây là đại biểu được gọi về thay đổi hướng. Bạn có thể sử dụng đối tượng của lớp cụ thể để gọi phương thức shouldAutorotate của nó và thiết lập các vị trí điều khiển camera theo hướng.

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    [self.objController shouldAutorotate]; 
    return UIInterfaceOrientationMaskAll; 
} 

Bây giờ bên cameraviewcontroller.m

-(BOOL)shouldAutorotate 
{ 
    UIInterfaceOrientation interfaceOrientation = [[UIDevice currentDevice]orientation]; 

    if(interfaceOrientation == UIInterfaceOrientationPortrait) 
    { 
     // your controls setup 
    } 
    else 
    { 
     // view accordingly for landscape 
    } 
} 

Tôi đã cố gắng để trang trải tất cả các điểm. Hãy cho tôi biết nếu bạn có bất kỳ sự nhầm lẫn nào. Hy vọng nó sẽ giúp :)

1) Bạn cần kiểm tra điều kiện về sự kiện nhấp của nút máy ảnh lật.

2) AppDelegate.h: Khai báo đối tượng của lớp học nơi bạn ghi video và tạo thuộc tính. Ở đây tôi đang sử dụng CameraViewController làm ví dụ.

CameraViewController *objController; 

Bây giờ trong AppDelegate.m:

self.objController = [[CameraViewController alloc]initWithNibName:@"CameraViewController" bundle:nil]; 

Bây giờ sử dụng trường hợp này để gọi phương thức shouldAutorotate như tôi đã trình bày ở trên. Và trở về định hướng phong cảnh:

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    if(isOptionScreenActive == YES) 
    { 
     [self.shareController shouldAutorotate]; 
     return UIInterfaceOrientationMaskLandscape; 
    } 
    else 
    { 
     [self.anotherController shouldAutorotate]; 
     return UIInterfaceOrientationMaskPortrait; 
    } 
} 

Dưới đây là một isOptionScreenActiveflag được thiết lập trong các viewWillAppear của lớp ghi âm. Đặt nó false trong viewDidUnload. Hoặc có thể là viewWillAppear của một lớp khác.

3) Tôi đã sử dụng cameraviewcontroller.m như một ví dụ. Nó phản ánh lớp ghi âm của bạn. Cũng trong phương thức shouldAutorotate của lớp quay video của bạn, nếu hướng được phát hiện là chân dung, chỉ cần trả về NO. Bằng cách này, giao diện người dùng sẽ không thay đổi và bạn chỉ có thể giữ giao diện người dùng ở chế độ ngang.

+0

cảm ơn cho nhận xét. một số câu hỏi trước khi tôi cố gắng thực hiện điều này: 1) "Để theo dõi chuyển đổi giữa máy ảnh, bạn có thể sử dụng cờ" - không thể tìm ra mã này nên ở đâu. 2) "Đây là đại biểu được gọi về thay đổi hướng. Bạn có thể sử dụng đối tượng của lớp cụ thể để gọi phương thức shouldAutorotate của nó và thiết lập vị trí điều khiển máy ảnh của bạn theo hướng." - "self.objController" - đây là gì?Tôi chỉ có một màn hình nơi tôi quay video. Nó phải là cảnh quan. Những người khác đang ở hướng dọc. 3) cameraviewcontroller.m - đây là gì? –

+0

và tôi thấy rằng với giải pháp của bạn, nó sẽ hỗ trợ cả hai hướng. chỉ với các điều khiển tùy chỉnh. Tôi cần phải làm cho nó hoạt động * chỉ * theo hướng ngang. để khóa nó. –

+0

Tôi đã cập nhật câu trả lời cho phù hợp với truy vấn của bạn. Xem nếu nó giúp. – Maverick