2010-07-21 38 views
20

Ứng dụng của tôi bao gồm thanh công cụ và AVCaptureVideoPreviewLayer trong nền UIView. Tôi muốn thấy rằng thanh công cụ xoay về hướng thiết bị, vì vậy trong ViewController chính của tôi, tôi thực hiện các chức năng:Tắt tính năng xoay tự động cho UIView

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

này hoạt động tốt, nhưng khi định hướng giao diện được thay đổi, tôi thấy rằng nền UIView (với một lớp video) cũng đang quay, do đó, xem video của tôi hiện đang chơi 90 độ trái hoặc phải ... Mà không phải là thực sự mát mẻ!
Vì vậy, câu hỏi của tôi là: có cách nào để tắt hoạt ảnh xoay tự động trên UIView cụ thể không?

Tôi đã thấy một câu hỏi tương tự với câu hỏi này: Disabling autorotate for a single UIView, nhưng câu trả lời không phù hợp với vấn đề của tôi, tôi thực sự cần chế độ xem nền để không di chuyển, chứ không phải để giải quyết vấn đề ". Vì vậy, tôi quyết định đưa ra chủ đề này.

Bất kỳ ý tưởng nào?

Cảm ơn!

+0

Tôi có cùng một vấn đề. Bạn đã giải quyết nó? nó hoạt động với ios 6? Bạn có thể đặt một câu trả lời hoàn chỉnh? Cảm ơn rất nhiều. –

Trả lời

-2

Hãy thử điều này:

myVideoCaptureLayer.orientationSupported = NO; 
+5

Như tôi đã hiểu, thuộc tính orientationSupported là chỉ đọc và cho biết thiết bị có thể thay đổi hướng video hay không. Nếu đúng, thì người ta có thể thay đổi thuộc tính "định hướng" thành giá trị chính xác (AVCaptureVideoOrientationPortrait, AVCaptureVideoOrientationLandscapeLeft, ...). Cảm ơn bạn đã đưa tôi đi đúng hướng! –

+0

Rất tiếc! Đã bỏ lỡ phần chỉ đọc. Vui mừng nó đã giúp. – christo16

2
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return NO; 
} 

Hoặc bạn đang nói chỉ vô hiệu hóa khi một chế độ xem nhất định hiển thị? Nếu có, bạn có thể kiểm tra điều này bằng phương thức isDescendantOfView của UIView.

+1

Vâng, tôi không muốn vô hiệu hóa toàn bộ xoay vòng giao diện, chỉ để vô hiệu hóa nó trên một UIView cụ thể trong hệ thống phân cấp khung nhìn của viewController chính. Nó có nghĩa là khi tôi xoay thiết bị, tôi thấy thanh công cụ quay, nhưng không phải là chế độ xem video. –

+0

Đây không phải là một phương pháp trên UIView - đó là trên UIViewController. Vì vậy, nó sẽ vô hiệu hóa vòng xoay cho toàn bộ hệ thống phân cấp khung nhìn. – colinta

+0

Đây là những gì tôi đang tìm kiếm ... – ATOzTOA

1

Tôi chạy vào cùng một vấn đề, mặc dù chỉ đơn giản là thiết lập thuộc tính định hướng trên AVCaptureVideoPreviewLayer là chưa đủ. Vấn đề bổ sung là CALayer không hỗ trợ trình quản lý bố cục trên iPhone, vì vậy khung của lớp video có thể không chính xác khi thiết bị được xoay.

Tôi đã khắc phục điều này bằng cách sử dụng UIView tùy chỉnh để chứa AVCaptureVideoPreviewLayer và sau đó tôi đã ghi đè phương thức layoutSubviews cho chế độ xem này để đảm bảo rằng khung của lớp video luôn được đặt chính xác. Đây cũng là một nơi tốt để thiết lập thuộc tính định hướng. Tức là, UIView của tôi trông giống như:

@implementation VideoPreview 

@synthesize previewLayer; 

- (void) layoutSubviews { 
    if (previewLayer) { 
     // set the correct orientation for the video layer 
     previewLayer.orientation = [[UIDevice currentDevice] orientation]; 

     // and set its frame to that of its parent UIView 
     previewLayer.frame = self.bounds; 
    } 
} 

- (void) addPreviewLayer: (AVCaptureVideoPreviewLayer *) videoLayer { 
    previewLayer = videoLayer; 
    [self.layer addSublayer:videoLayer]; 
} 

@end 
11

Bài đăng này chỉ đúng hướng. Để có được một AVCaptureVideoPreviewLayer không xoay với thiết bị I bọc nó trong một UIView và hoạt hình điểm cho rằng theo hướng ngược lại:

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 

    float rotation; 

    if (toInterfaceOrientation==UIInterfaceOrientationPortrait) { 
     rotation = 0; 
    } else 
    if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft) { 
     rotation = M_PI/2; 
    } else 
    if (toInterfaceOrientation==UIInterfaceOrientationLandscapeRight) { 
     rotation = -M_PI/2; 
    } 

    [UIView animateWithDuration:duration animations:^{ 
     cameraPreview.transform = CGAffineTransformMakeRotation(rotation); 
     cameraPreview.frame = self.view.frame; 
    }]; 
} 

Có vẻ như một chút vòng xoay nhưng nó sinh động trơn tru. Các chế độ xem khác ở đầu lớp xem trước tự động xoay khi cần.

+0

Cảm ơn! Điều đó đã làm nó cho tôi. – KPM

+0

Tôi đã thay đổi mã khung hình một chút: CGRect f = cameraPreview.frame; cameraPreview.transform = CGAffineTransformMakeRotation (xoay); cameraPreview.frame = f; – colinta

+0

Xin chào, Cảm ơn bạn, sẽ không 'self.view.frame' trả về khung xem xoay? vì vậy nếu nó là cảnh quan, nó sẽ trả lại khung cảnh, nếu chân dung, do đó, khung chân dung, vv Xin vui lòng sửa tôi nếu tôi sai. – Malloc

0

Cuối cùng tôi đã tìm thấy câu trả lời lành mạnh cho việc này. Không còn lộn xộn xung quanh với "hình ảnh động chống xoay" và như vậy!

Điều quan trọng là sử dụng UIViewController cho lớp xem trước của bạn (chế độ xem không xoay) và một cho giao diện thực tế.Cấu hình các tùy chọn xoay vòng cho cả sử dụng shouldAutorotateToInterfaceOrientation: (mã là trong các câu trả lời ở trên):

  • Bộ điều khiển xem preview nên được thiết lập để không xoay
  • Bộ điều khiển xem giao diện nên được thiết lập để xoay sang hướng bạn cần

Điều quan trọng là giữ cho chế độ xem riêng biệt bằng cách thêm chúng trực tiếp vào cửa sổ. Tôi làm điều này trong AppDelegate:

[self.window addSubview:previewViewController.view]; 
[self.window addSubview:interfaceViewController.view]; 
self.window.rootViewController = interfaceViewController; 
[self.window makeKeyAndVisible]; 

Điều đó đặt xem trước video của bạn ở chế độ nền và sau đó thêm giao diện xem qua nó. Giao diện miễn phí để tự động sửa mà không ảnh hưởng đến bản xem trước.

Một điều quan trọng cần lưu ý: nền của chế độ xem giao diện phải trong suốt, nếu không nó sẽ chặn bản xem trước.

Các vấn đề liên quan