2013-04-08 36 views
7

Xin chào Tôi đang cố gắng sao chép cùng một vòng quay có thể được nhìn thấy trong ứng dụng máy ảnh khi hướng được chuyển sang ngang. Thật không may tôi đã không có may mắn. Tôi cần phải thiết lập điều này cho máy ảnh tùy chỉnhOverlayView với UIImagePickerController.Tái tạo ứng dụng quay camera theo phong cảnh IOS 6 iPhone

Từ bức chân dung này (B là UIButtons)

|-----------| 
|   | 
|   | 
|   | 
|   | 
|   |  
|   | 
| B B B | 
|-----------| 

Để cảnh này

|----------------| 
|    B | 
|    | 
|    B | 
|    | 
|    B | 
|----------------| 

Nói cách khác tôi muốn các nút để dính vào đáy chân dung ban đầu và xoay trên trung tâm của họ. Tôi đang sử dụng Storyboards và Autolayout được bật. Bất kỳ trợ giúp nào cũng được đánh giá rất cao.

+0

đã hỏi cùng một câu hỏi một thời gian trước đây - http://stackoverflow.com/questions/15377120/uiimagepickercontroller-record-video-with-landscape-orientation tiếc là vẫn không có câu trả lời hay. –

+0

Vâng, tôi đã không quan tâm đến các ràng buộc Autolayout trong xcode nhưng chúng rõ ràng là cụ thể cho các yếu tố neo vào đáy định hướng hiện tại chứ không phải là đáy chân dung ban đầu. Nỗ lực tiếp theo của tôi là thử và thiết lập các contraints lúc runtime với '- (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) toInterfaceOrientation duration: (NSTimeInterval) duration' Bạn có bất cứ đề xuất nào mặc dù @Aaron? – pechar

Trả lời

15

OK, vì vậy tôi đã quản lý để sắp xếp điều này. Một điều cần lưu ý là lớp UIImagePickerController chỉ hỗ trợ chế độ dọc theo Apple documentation.

Để nắm bắt vòng quay willRotateToInterfaceOrientation là vô ích ở đây, vì vậy bạn phải sử dụng notificatons. Ngoài ra thiết lập contraints autolayout tại thời gian chạy không phải là con đường để đi.

Trong appdelegate didFinishLaunchingWithOptions bạn cần phải thông báo xoay được kích hoạt:

// send notification on rotation 
[[UIDevice currentDevice]beginGeneratingDeviceOrientationNotifications]; 

Trong viewDidLoad phương pháp của cameraOverlayView UIViewController thêm như sau:

//add observer for the rotation notification 
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; 

Cuối cùng thêm phương pháp orientationChanged: đến cameraOverlay UIViewController

- (void)orientationChanged:(NSNotification *)notification 
{ 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 
    double rotation = 0; 

    switch (orientation) { 
     case UIDeviceOrientationPortrait: 
      rotation = 0; 
      break; 
     case UIDeviceOrientationPortraitUpsideDown: 
      rotation = M_PI; 
      break; 
     case UIDeviceOrientationLandscapeLeft: 
      rotation = M_PI_2; 
      break; 
     case UIDeviceOrientationLandscapeRight: 
      rotation = -M_PI_2; 
      break; 
     case UIDeviceOrientationFaceDown: 
     case UIDeviceOrientationFaceUp: 
     case UIDeviceOrientationUnknown: 
     default: 
      return; 
    } 
    CGAffineTransform transform = CGAffineTransformMakeRotation(rotation); 
    [UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
     self.btnCancel.transform = transform; 
     self.btnSnap.transform = transform;  
    }completion:nil]; 
} 

Đoạn mã trên áp dụng phép biến đổi xoay vòng trên 2 UIButton mà tôi đang sử dụng trong trường hợp này là btnCancel và btnSnap. Điều này mang lại cho bạn hiệu ứng ứng dụng Máy ảnh khi xoay thiết bị. Tôi vẫn nhận được Cảnh báo trong bảng điều khiển <Error>: CGAffineTransformInvert: singular matrix. không chắc chắn tại sao điều này xảy ra nhưng đó là điều cần làm với chế độ xem máy ảnh.

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn. Điều này thực sự đã giúp tôi. – Zigglzworth

+0

Rất vui khi được trợ giúp! – pechar

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