4

我有一个照片应用程序,它覆盖了相机图像选择器上的自定义按钮(用于拍照、打开/关闭闪光灯、其他常用的东西等)

我希望控制界面只支持纵向(我说的是控制按钮/界面,而不是实际捕获的图像),直到 iOS 6 都可以正常工作。

但是,在升级到 xCode 5.0 版并将我的 iPad 3 升级到 iOS 7(GM Seed,适用于 iPad WiFi 3rd Generation)后,我发现相机选择器界面在方向改变时会自动旋转。令人惊讶的是,我在 iPhone 5(升级到 iOS 7)上测试了相同的版本,但自动旋转问题并没有表现出来。

[再次确定,我在 iOS 6 中再次测试了相同的代码,并且在 iPhone 或 iPad 中都没有发生自动旋转]。

只是为了演示我如何处理我的图像选择器,这里有一些代码片段:

    UIImagePickerController *pickercustom = [[UIImagePickerController alloc] init];
    pickercustom.sourceType = UIImagePickerControllerSourceTypeCamera;
    pickercustom.showsCameraControls = NO;
    pickercustom.wantsFullScreenLayout = YES;
    pickercustom.navigationBarHidden=YES;
    pickercustom.view.userInteractionEnabled=YES;

    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {


    if (IPAD.userInterfaceIdiom == UIUserInterfaceIdiomPad)
    {
        pickercustom.delegate = self;
           UIDevice *currentDevice = [UIDevice currentDevice];
                    while ([currentDevice isGeneratingDeviceOrientationNotifications])
                        [currentDevice endGeneratingDeviceOrientationNotifications];


        [self presentViewController:pickercustom animated:YES completion:nil];

                    while ([currentDevice isGeneratingDeviceOrientationNotifications])
                        [currentDevice endGeneratingDeviceOrientationNotifications];

    }

    else
    {
        pickercustom.delegate = self;
        [self presentViewController:pickercustom animated:YES completion:nil];
    }
  }

添加了“endGeneratingDeviceOrientationNotifications”以阻止界面旋转(迄今为止工作正常)。

读完后我还尝试添加这三种方法:iOS 6 中的 UIImagePickerController 无法正常工作

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

  - (BOOL)shouldAutorotate
  {
    return NO;
    }

 - (NSUInteger)supportedInterfaceOrientations
  {
    return UIInterfaceOrientationMaskPortrait;
  }

...但这也许是 iOS 6 特定的解决方案。在我的情况下它不起作用。

如果您能找出根本原因,请告诉我。这将是很大的帮助。

4

2 回答 2

2

你很亲密。当你想支持旋转但又想让那个viewController 不旋转时,事情就变得棘手了

UIResponder 链真的希望整个应用程序具有相同的旋转。只是简单地覆盖单个类中的旋转委托方法是行不通的。(仅供参考,在您的情况下,您需要子类化 UIImagePickerController 才能添加这些方法。)您需要在根导航控制器中实现这些委托方法(您需要再次拥有自己的子类),并且覆盖它们以查询最顶层的 viewController 以获得所需的旋转。就像是:

// Handles the should Auto Rotation for all view controllers
- (BOOL)shouldAutorotate {

    if ([self.topViewController conformsToProtocol:@protocol(CustomRotation)]) {
        return [self.topViewController shouldAutorotate];
    }

    // Auto rotate the screen by default.
    return YES;
}

// Handles the supported Interface Orientations for all View Controllers by seeing if
// the top level viewController responds to Custom Rotation callbacks.
- (NSUInteger)supportedInterfaceOrientations {
    if ([self.topViewController conformsToProtocol:@protocol(CustomRotation)]) {
        return [self.topViewController supportedInterfaceOrientations];
    }

    // The default rotation for the application.
    return UIInterfaceOrientationMaskAll;
}

您不能使用respondsToSelector:代替,conformsToProtocol:因为选择器方法将始终返回YES任何派生自UIResponder(例如,所有内容)的类,并且您必须覆盖项目中每个 UIViewController 上的旋转委托以使其工作. 相反,您可以创建一个空白协议 ( CustomRotation)。在您的自定义轮换类中,需要该协议并包含您在上面所具有的重写轮换委托方法,以及您想要的限制。

最后确保在 xcode 和/或您的Application: didFinishLaunchingWithOptions方法中正确设置了您支持的界面方向。

于 2013-09-26T19:48:13.243 回答
2

据我为同一主题所做的研发,IOS7 iPad中的Imagepicker Camera具有默认界面将方向更改为横向。他们以这种方式设计了界面。我们无法强制锁定它的方向。

如果仍然愿意,您必须使用自定义 ImagePicker 使用 AVCam https://developer.apple.com/library/ios/samplecode/avcam/Introduction/Intro.html

和自定义图像选择器... http://www.codza.com/custom-uiimagepickercontroller-camera-view

并强行锁定方向...

于 2013-12-18T07:01:58.683 回答