支撑取向与应用程序中没有共同的方向,并shouldAutorotate将返回YES”(Support

2019-06-18 06:36发布

我的应用程序(的iPad; iOS 6中)是一个风景唯一的应用程序,但是当我尝试使用UIPopoverController显示照片库,它抛出这个错误: Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES. 我试着改变了很多周围的代码,但我有没有运气。

Answer 1:

在iOS6的你已经在三个地方支持的接口方向:

  1. 所述的.plist(或目标摘要屏幕)
  2. 你UIApplicationDelegate
  3. 正在显示的UIViewController中

如果您收到此错误是最有可能是因为您加载在你的UIPopover的观点仅支持肖像模式。 这可以通过游戏中心,iAd的,还是自己的看法引起的。

如果这是你自己的观点,您可以通过覆盖在您的UIViewController supportedInterfaceOrientations解决这个问题:

- (NSUInteger) supportedInterfaceOrientations
{
     //Because your app is only landscape, your view controller for the view in your
     // popover needs to support only landscape
     return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

如果不是你自己的观点(如GameCenter的在iPhone上),你需要确保你的.plist支持肖像模式。 你还需要确保你UIApplicationDelegate支持显示在肖像模式的看法。 您可以通过编辑您的.plist,然后覆盖上你UIApplicationDelegate的supportedInterfaceOrientation做到这一点:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}


Answer 2:

花了很多时间寻找一种方法来避免子类化和增加吨的代码后,这里是我的一行代码解决方案。

创建一个新的UIImagePickerController的种类和添加

-(BOOL)shouldAutorotate{
    return NO;
}

这是所有乡亲!



Answer 3:

有可能会出现此错误消息的另一个案例。 我在寻找小时,直到我发现这个问题。 该线程是看完了几次后,非常有帮助。

如果您的主视图控制器旋转到横向和调用应显示在纵向当你的代码看起来像这样可能发生此错误消息的自定义子视图控制器:

- (NSUInteger)supportedInterfaceOrientations {

    return UIInterfaceOrientationPortrait;
}

这里的陷阱是Xcode的智能感知提示“UIInterfaceOrientationPortrait”我不关心它。 乍看之下,这似乎是正确的。

右掩模被命名为

UIInterfaceOrientationMaskPortrait

要知道小缀“面具”的,否则你的子视图将结束与一个例外,上述提到的错误消息。

新枚举的位移位。 旧枚举返回无效值!

(在UIApplication.h你可以看到新的声明:UIInterfaceOrientationMaskPortrait =(1 << UIInterfaceOrientationPortrait))

解决的办法是:

- (BOOL)shouldAutorotate {

    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {

    // ATTENTION! Only return orientation MASK values
    // return UIInterfaceOrientationPortrait;

    return UIInterfaceOrientationMaskPortrait;
} 

在迅速使用

override func shouldAutorotate() -> Bool {

    return true
}

override func supportedInterfaceOrientations() -> Int {

    return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}


Answer 4:

在景观呈现图像拾取时,唯一的应用程序我有一个类似的问题。 正如博士Luiji的建议,我添加了以下类别在我的控制器的开始。

// This category (i.e. class extension) is a workaround to get the
// Image PickerController to appear in landscape mode.
@interface UIImagePickerController(Nonrotating)
- (BOOL)shouldAutorotate;
@end

@implementation UIImagePickerController(Nonrotating)

- (BOOL)shouldAutorotate {
  return NO;
}
@end

这是最简单的只是你的视图控制器.m文件的@implementation之前添加这些行。



Answer 5:

我在我的代码遇到同样的错误消息。 我发现这一点,这是所报告的苹果公司的一个错误:

https://devforums.apple.com/message/731764#731764

他的解决办法是解决它在AppDelegate中。 我实现它,它为我的作品!



Answer 6:

我有同样的问题,这个答案https://stackoverflow.com/a/12523916对我的作品。 不知道是否有一个更优雅的解决方案。

我的代码:

UIImagePickerController  *imagePickerController = [[NonRotatingUIImagePickerController alloc] init];
imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

UIPopoverController  *popoverVC = [[UIPopoverController alloc] initWithContentViewController:imagePickerController];    

[popoverVC presentPopoverFromRect:frame   // did you forget to call this method?
                           inView:view
         permittedArrowDirections:UIPopoverArrowDirectionAny
                         animated:YES];


Answer 7:

iOS的8 - 你可以使用UIModalPresentationPopover没有任何黑客在酥料饼的显示。 不理想,但总比没有好。

imagePicker.modalPresentationStyle = UIModalPresentationPopover;
imagePicker.popoverPresentationController.sourceView = self.view;
imagePicker.popoverPresentationController.sourceRect = ((UIButton *)sender).frame;

编辑:也许尝试不同的UIModalPresentationStyles - 也许更会在景观工作。



Answer 8:

- (BOOL)shouldAutorotate {
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

This removes the crash.


Answer 9:

这解决了我的问题的另一种选择是创建的UIImagePickerController的一个子类,并覆盖以下方法

@interface MyImagePickerController ()

@end

@implementation MyImagePickerController

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

用此代替的UIImagePickerController的,这一切工作正常。



Answer 10:

创建一类是真正有用的,以修复这个bug。 而且不要忘了导入您创建的类别。 这将丢失的方法添加到的UIImagePickerController和iOS 6将限制它在人像工作只是作为文档BTW状态。

其他的解决方案可能会奏效。 但随着SDK的编译在iOS 6.1的iOS部署这8.x中似乎要走的路。

在.H文件:

#import <UIKit/UIKit.h>

@interface UIImagePickerController (iOS6FIX)

- (BOOL) shouldAutorotate;
- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation;

@end

在.M文件:

#import "UIImagePickerController+iOS6FIX.h"

@implementation UIImagePickerController (iOS6FIX)

- (BOOL) shouldAutorotate {
    return NO;
}

- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

@end


Answer 11:

斯威夫特3

let imagePicker = UIImagePickerController()

imagePicker.modalPresentationStyle = .popover
imagePicker.popoverPresentationController?.sourceView = sender // you can also pass any view 

present(imagePicker, animated: true)


Answer 12:

转换时,我遇到这个问题,崩溃UIInterfaceOrientationPortraitUIInterfaceOrientationMaskPortrait隐含的返回值。

关于更多代码背景UIPageViewControllerDelegate ,只是FYI为大家。

 -(UIInterfaceOrientationMask)pageViewControllerSupportedInterfaceOrientations:
(UIPageViewController *)pageViewController
{
    # return UIInterfaceOrientationPortrait;    # wrong
    return UIInterfaceOrientationMaskPortrait;  # correct
}


Answer 13:

我刚刚解决了斯威夫特4.x的问题

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    configureVideoOrientation()
}

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    coordinator.animate(alongsideTransition: nil, completion: { [weak self] _ in
        self?.configureVideoOrientation()
    })
}

private func configureVideoOrientation() {
    guard let previewLayer = self.previewLayer, let connection = previewLayer.connection else { return }
    if connection.isVideoOrientationSupported {
        let orientation = UIApplication.shared.statusBarOrientation
        switch (orientation) {
        case .portrait:
            previewLayer.connection?.videoOrientation = .portrait
        case .landscapeRight:
            previewLayer.connection?.videoOrientation = .landscapeRight
        case .landscapeLeft:
            previewLayer.connection?.videoOrientation = .landscapeLeft
        case .portraitUpsideDown:
            previewLayer.connection?.videoOrientation = .portraitUpsideDown
        default:
            previewLayer.connection?.videoOrientation = .portrait
        }

        previewLayer.frame = self.view.bounds
    }
}

谢谢你们对你的答案也。 我刚刚削减工作代码,只是重构它。



Answer 14:

斯威夫特4及以上假设整个应用程序是在景观,你需要在纵向呈现单个控制器。 在具有变为纵向添加以下视图控制器:

override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

open override var shouldAutorotate: Bool {
    return false
}


文章来源: Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES'