扩展UIImagePicker控制器无助于防止io6中的旋转

时间:2013-01-21 18:21:36

标签: objective-c cocoa-touch ios6 uiimagepickercontroller

我的应用程序在info.plist中设置为仅支持纵向模式。

但是,当用户将屏幕旋转为横向时,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];
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

也许你会认为这个答案没有用;但我只是粘贴Apple文档中的一个片段:

  

重要说明:UIImagePickerController类仅支持纵向模式。此类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改,但有一个例外。您可以将自定义视图分配给cameraOverlayView属性,并使用该视图显示其他信息或管理相机界面与代码之间的交互。

UIImagePickerController Doc Link

很抱歉成为一个快乐的人。你应该寻找替代课程。快速搜索显示有一堆。