-1

我的应用程序在 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];
}
4

2 回答 2

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

于 2013-01-22T18:36:25.270 回答
1

也许您会认为这个答案没有帮助;但我将粘贴 Apple 文档中的一个片段:

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

UIImagePickerController 文档链接

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

于 2013-01-22T19:27:43.700 回答