应用程序仅支持竖屏,但UIImagePickerController在iOS6中会旋转

6
请注意,下面的答案在iOS6上不起作用,所以我仍需要一个答案!
我的应用程序只启用纵向模式。
但是,如果我将UIImagePickerController嵌入其中作为子视图,并旋转设备,则顶部和底部栏保持在相同位置,但UIImagePickerController会旋转。
如何防止其旋转?
以下是代码:
    [self.view.window addSubview:self.imagePickerController.view];
    self.imagePickerController.showsCameraControls = NO; 
    self.imagePickerController.view.frame = CGRectMake(0, 90, 320, 320);
    self.imagePickerController.allowsEditing = NO;

已编辑

我正在使用iOS6,在哪里应该调用shouldAutorotate方法?


请查看:https://dev59.com/LXRB5IYBdhLWcg3wuZU1 - C0D3
4个回答

12

将这个UIImagePickerController类别添加到你的类中,

@interface UIImagePickerController(Nonrotating)
- (BOOL)shouldAutorotate;
@end

@implementation UIImagePickerController(Nonrotating)

- (BOOL)shouldAutorotate {

  return NO;
}

@end

1
在你的类中添加是什么意思?它可以是一个单独的文件吗?如果可以的话,我如何引用它? - Dejell
它不起作用。当我旋转iPhone时,UIImagePickerController也会旋转。它不听任何方法。 - Dejell
我认为https://dev59.com/I2cs5IYBdhLWcg3wh0f7会对我有所帮助。 - Dejell
你能否修正一下你的回答,这样我就可以选择它了吗?因为我不明白如何使用willRotateToInterfaceOrientation。 - Dejell
@Odelya 我以前没有使用过 willRotateToInterfaceOrientation.. 我会尝试一下.. 你检查过 info.plist 中是否删除了不需要的方向吗? - Anusha Kottiyal
显示剩余2条评论

2
在您的控制器中包含以下内容,这将起作用。我只是创建UIImagePickerController的类别。
@interface UIImagePickerController (private)

- (BOOL)shouldAutorotate;
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation;
- (NSUInteger)supportedInterfaceOrientations;
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;

@end


@implementation UIImagePickerController (Private)

- (NSUInteger)supportedInterfaceOrientations {

    return UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutorotate {

    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{  
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end

您的意思是我可以简单地创建2个文件h和m,将它们放置在项目中任何位置,就能使其工作? - Dejell
不要啊,在你实现imagePickerController的控制器中包含它。 - junaidsidhu
它会在 supportedInterfaceOrientations 方法上停止(断点),但仅在它被打开时。 - Dejell
我认为https://dev59.com/I2cs5IYBdhLWcg3wh0f7会对我有帮助。 - Dejell
在实现的末尾,您不需要一个"@end"吗? - C0D3
显示剩余5条评论

0
一种可能性是覆盖


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation;

UIImagePickerController的方法。我不确定这是否是最佳选择,但它可以工作。

因此,如果您只想将UIImagePickerController旋转为纵向,请使用以下代码:

@interface PortraitUIImagePickerController : UIImagePickerController

@end

实现应该类似于以下内容

@implementation PortraitUIImagePickerController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    return UIInterfaceOrientationIsPortrait(toInterfaceOrientation);
}

@end

我正在使用iOS6,shouldAutorotateToInterfaceOrientation已被弃用。 - Dejell

0

在最受欢迎的答案中,类别是有效的,但由于不鼓励使用类别,您也可以创建UIImagePickerController的子类并使用它。

如果您想避免UIImagePickerController的旋转,请添加以下类

UINonRotatableImagePickerController.h

@interface UINonRotatableImagePickerController : UIImagePickerController

@end

UINonRotatableImagePickerController.m

@implementation UINonRotatableImagePickerController

- (BOOL)shouldAutorotate
{
    return NO;
}

@end

您需要将Storyboard中的UIImagePicker类更改为UILandscapeImagePickerController,或者如果您在代码中分配它,则需要更改

UIImagePickerController *picker = [[UIImagePickerController alloc] init];

UIImagePickerController *picker = [[UINonRotatableImagePickerController alloc] init];

并在您的代码中包含UINonRotatableImagePickerController.h。


imagePicker 始终是竖屏的,不支持子类化,它只有在作为子视图添加时才会旋转,因为它是由父视图旋转而不是自身旋转。 - AsifHabib
也许对于iPhone来说是这样,但我在iPad上有我的全屏图像选择器处于横向状态。 - masam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接