2013-01-21 60 views
-1

我的應用程序在info.plist中設置爲僅支持肖像模式。擴展UIImagePicker控制器無助於防止在io6中旋轉

但是,當用戶將屏幕旋轉到橫向時,UIImagePickerController會旋轉。

由於IO6方法shouldAutoRotate不會被調用,我試着像這樣延伸:

@interface NonRotatingUIImagePickerController : UIImagePickerController 

@end 

@implementation NonRotatingUIImagePickerController 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 

} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

@end 

但它並不能幫助。任何想法爲什麼?

而在日誌中我看到上述方法被調用。 UIImagePickerController首先以縱向顯示,當用戶旋轉時 - 它也旋轉,而不是保持縱向。

我設置在這樣的視圖中的圖片選擇器:

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (!self.imagePickerController) { 
     self.imagePickerController = [[NonRotatingUIImagePickerController alloc] init]; 
     self.imagePickerController.delegate = self; 
    } 
    return self; 
} 

- (void)viewDidAppear:(BOOL)animated{ 
    self.imagePickerController.showsCameraControls = NO; 
    CGRect imagePickerControllerFrame = CGRectMake(0, topBar.frame.size.height, self.view.frame.size.width, self.view.frame.size.height - topBar.frame.size.height - bottomBar.frame.size.height); 
    self.imagePickerController.view.frame = imagePickerControllerFrame; 
    self.imagePickerController.allowsEditing = YES; 
    self.imagePickerController.view.clipsToBounds = YES; 
    self.imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera 
    [self.view.window addSubview:self.imagePickerController.view]; 
} 
+0

你能展示代碼來證明你實際上在使用這個類嗎? – matt

+0

完成。請注意,我添加圖像選擇器作爲子視圖 – Dejell

回答

1
self.imagePickerController.view.frame = imagePickerControllerFrame; 
// ... 
[self.view.window addSubview:self.imagePickerController.view]; 

嗯,這是所有的非法完全。 Apple在文檔中對此做了非常清楚的說明:

此類旨在按原樣使用,不支持子類。這個類的視圖層次是私人的,不能修改

只有一個用採用UIImagePickerControllerSourceTypeCamera圖像拾取控制器正確的方式 - 爲全屏呈現視圖控制器:

BOOL ok = [UIImagePickerController isSourceTypeAvailable: 
      UIImagePickerControllerSourceTypeCamera]; 
if (!ok) { 
    NSLog(@"no camera"); 
    return; 
} 
NSArray* arr = [UIImagePickerController availableMediaTypesForSourceType: 
       UIImagePickerControllerSourceTypeCamera]; 
if ([arr indexOfObject:(NSString*)kUTTypeImage] == NSNotFound) { 
    NSLog(@"no stills"); 
    return; 
} 
UIImagePickerController* picker = [UIImagePickerController new]; 
picker.sourceType = UIImagePickerControllerSourceTypeCamera; 
picker.mediaTypes = @[(NSString*)kUTTypeImage]; 
picker.delegate = self; 
[self presentViewController:picker animated:YES completion:nil]; 

如果你要現場拍攝一個接口裏面的你的自己的接口,使用AVFoundation和它給你的相機捕獲API。

下載工作示例這裏:

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/ch30p816cameraCaptureWithAVFoundation/p683cameraCaptureWithAVFoundation/ViewController.m

+0

我試圖將其創建爲全屏 - 它仍然會旋轉,儘管我的應用程序僅在縱向模式下在info.plist中定義。這是否意味着爲了禁用旋轉,我必須使用AVFoundation界面? – Dejell

+0

在iPad上,它是可旋轉的,你無能爲力。 (這可能是一個錯誤,但我不知道;你可以嘗試提交一個錯誤。)但底線是:這不是你的看法。這不是你的視圖控制器。按原樣使用它或使用AVFoundation進行自己的推廣。 – matt

+0

謝謝。我不明白爲什麼Apple爲UIImagePickerController提供這樣一個有限的實現 – Dejell

1

也許你會認爲這個答案無益的;但我只是從Apple的文檔中粘貼一段代碼:

重要提示:UIImagePickerController類僅支持縱向模式。此類旨在按原樣使用,不支持子類。這個類的視圖層次是私有的,不能修改,只有一個例外。您可以將自定義視圖分配給cameraOverlayView屬性,並使用該視圖呈現附加信息或管理攝像頭界面和代碼之間的交互。

UIImagePickerController Doc Link

對不起,是一個kill-喜悅。你應該找一個替代課。快速搜索顯示有一堆。