지원되는 방향은 응용 프로그램과 공통된 방향이 없으며 shouldAutorotate가 YES를 반환합니다.


92

내 앱 (iPad; iOS 6)은 가로 전용 응용 프로그램이지만 UIPopoverController를 사용하여 사진 라이브러리를 표시하려고하면이 오류가 발생합니다. Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES.많은 코드를 변경해 보았지만 운이 없었습니다.


1
대답을 받아 들여야합니다. 도움을 청하는 사람들이 많고 같은 문제를 가진 다른 사람들을 위해 문제에 대한 정답을 표시하면 도움이됩니다!
brush51

1
아니! 아이폰 OS 7 :( (headbang)에 대한 해결책 작동하지 않습니다
AsifHabib

답변:


94

IOS6에서는 세 곳에서 인터페이스 방향을 지원했습니다.

  1. .plist (또는 대상 요약 화면)
  2. UIApplicationDelegate
  3. 표시되는 UIViewController

이 오류가 발생하면 UIPopover에서로드하는 뷰가 세로 모드 만 지원하기 때문일 가능성이 큽니다. 이는 Game Center, 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;
}

자신의보기가 아닌 경우 (예 : iPhone의 GameCenter) .plist가 세로 모드를 지원하는지 확인해야합니다. 또한 UIApplicationDelegate가 세로 모드로 표시되는보기를 지원하는지 확인해야합니다. .plist를 편집 한 다음 UIApplicationDelegate에서 supportedInterfaceOrientation을 재정 의하여이를 수행 할 수 있습니다.

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

3
UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight동일 UIInterfaceOrientationMaskAllButUpsideDown UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight같음UIInterfaceOrientationMaskLandscape
발레리 파블로프

4
또는 UIInterfaceOrientationMaskAll을 사용하십시오.
Mark Wang

완전한. "세로 전용"팝 오버는 가로 모드에서 작동하지만 가로 전용 뷰 컨트롤러를 모달로 표시 할 수 없습니다.
Neal Ehardt

아니! 솔루션은 아이폰 OS 7 :(에 근무하지 않았다. stackoverflow.com/questions/23005351/...
AsifHabib

iOS 8에서 작업했습니다.하지만 plist에 세로 지원을 추가해야했습니다. 감사합니다.
Yaroslav

65

서브 클래 싱을 피하고 수많은 코드를 추가하는 방법을 찾는 데 많은 시간을 보낸 후, 여기에 한 줄 코드 솔루션이 있습니다.

새로운 UIImagePickerController의 카테고리를 만들고 추가

-(BOOL)shouldAutorotate{
    return NO;
}

그게 다야!


1
나를 위해 일했지만 완전히 테스트하지는 않았지만 지금까지 트릭을 수행하는 것 같습니다.
migs647

2
이것이 최선의 해결책 인 것 같습니다.
Julian

2
공장! 이것은 대단한데, 그것은 정말로 나를 꼬집는 데 도움이되었습니다. 감사합니다 Dr Luiji !!
brack

1
좋은. iOS 6에서 저에게 적합합니다. 완전한 유연성을 위해 카테고리에서 구성 할 수도 있습니다.
Jared Egan 2013

3
(PCH의에 포함되어 있지만) iOS7에 작동하지 않습니다, 카테고리 방법도 호출되지 않습니다
피터 Lapisu을

43

이 오류 메시지가 나타날 수있는 또 다른 경우가 있습니다. 나는 문제를 발견 할 때까지 몇 시간을 찾고 있었다. 이 스레드는 몇 번 읽은 후 매우 유용했습니다.

메인 뷰 컨트롤러가 가로 방향으로 회전하고 세로 방향으로 표시되어야하는 사용자 지정 하위 뷰 컨트롤러를 호출하는 경우 코드가 다음과 같을 때이 오류 메시지가 발생할 수 있습니다.

- (NSUInteger)supportedInterfaceOrientations {

    return UIInterfaceOrientationPortrait;
}

여기서 함정은 xcode의 인텔리 센스가 "UIInterfaceOrientationPortrait"를 제안한 것이었고 나는 그것에 대해 신경 쓰지 않았습니다. 언뜻보기에는 이것이 맞는 것 같았습니다.

오른쪽 마스크의 이름은

UIInterfaceOrientationMaskPortrait

작은 접미사 "Mask" 에 유의하십시오. 그렇지 않으면 서브 뷰가 예외와 위에서 언급 한 오류 메시지로 끝납니다.

새 열거 형은 비트 이동됩니다. 이전 열거 형은 잘못된 값을 반환합니다!

(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)
}

5
같은 이유로 내게 일어난
ChenXin

나는 사과가 반환 유형 UIInterfaceOrientationMask를 만들었 으면 좋겠다.
LightningStryk

Jackpearse의 대답이 정확 해 보입니다. 그러나 info.plist를 살펴보면 UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight가있는 UISupportedInterfaceOrientations가 있습니다. 어떤 MASK 없습니다 여기
onmyway133

1
@onmyway : 맞습니다. plist 값은 변경되지 않았습니다. 이전 iOS 버전에서 Apple은 코드 내에서 "비"마스크 값을 사용했습니다. 이것은 일부 유산입니다. 나는 애플이 현재 내부적으로 plist 값을 조금씩 이동하고 있다고 가정합니다.
JackPearse

내 앱은 Xcode 6.2의 iPad 시뮬레이터에서이 충돌 문제없이 작동했습니다. 그리고 며칠 전 Xcode 6.3으로 업그레이드 한 후 충돌이 발생했습니다. 이제이 솔루션이 내 문제를 해결합니다. Thx a lot :-)
Golden Thumb

22

가로 전용 앱에서 이미지 선택기를 표시 할 때 비슷한 문제가 발생했습니다. 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

ViewController .m 파일의 @implementation 바로 앞에 이러한 줄을 추가하는 것이 가장 쉽습니다.


초상화 전용 앱이 있습니다! 카메라를 가로 모드로 표시하고 싶습니다. 어떤 해결책 ?????
AsifHabib 2014

Trausti가 작동하지 않습니까? 나는 같은 문제가 있고 코드를 시도했지만 여전히 같은 예외가 나타납니다 *** 잡히지 않은 예외 'UIApplicationInvalidInterfaceOrientation', 이유 : '지원되는 방향은 응용 프로그램과 공통 방향이 없으며 shouldAutorotate는 YES를 반환합니다 ..... ... 나는 또한 UIimagePickerView 카테고리 메소드에 중단 점을 넣었습니다. shouldAutorotate가 거기에 도달하고 no를 반환하지만 여전히이 예외를 제공합니다 .... 내 앱은 Landscape 전용 앱입니다 ... 제발 도와주세요
Vishal16

또한 iOS 8에서 전체 앱이 가로 모드 일 때 SKStoreProductViewController가 세로로 표시되도록 강제합니다. 감사합니다.
Yaroslav

11

내 코드에서 동일한 오류 메시지가 발생했습니다. 나는 이것을 발견했다. 그것은 애플이보고 한 버그이다.

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

그의 해결책은 AppDelegate에서 수정하는 것입니다. 나는 그것을 구현했고 그것은 나를 위해 작동합니다!


그건 그렇고, 나는 원래 이것을 발견했다 : stackoverflow.com/questions/12522491/…
Robby

이것이 바로 Apple의 정답이었습니다. 그리고 동일한 지침을 따라야했지만 iOS 8을 대상으로하는 앱의 경우 Swift에서 수행해야했습니다. 모든 것이 잘 작동합니다. AppDelegate는 supportedInterfaceOrientationsForWindow를 가로 및 세로로 설정하고, 각 개별 신속한 파일 세트는 func supportedInterfaceOrientations를 가로로만 재정의하므로보기가 회전하지 않지만 세로보기 (내 경우에는 SKStoreProductViewController)를로드해야 할 때 작동합니다!
RanLearns

이런, 제안 된 해결책이 너무 많고 이건 지금까지 가장 높은 점수는 아니지만 실제로는 올바른 해결책입니다. iOS 10 및 9에서 테스트되었습니다. 다른 것은 작동하지 않습니다.
Demian Turner

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];

나는 그것을 시도했지만 버튼을 클릭하여 코드를 호출했지만 아무것도 표시 @interface NonRotatingUIImagePickerController : UIImagePickerController @end @implementation NonRotatingUIImagePickerController - (BOOL)shouldAutorotate { return NO; } @end되지 않았을 때 코드에 추가하려고 시도 했지만 내 코드가 NonRotatingUIImagePickerController를 감지하지 못했습니다.
Destiny Dawn

1
신경 쓰지 마세요, 지금은 NonRotatingUIImagePickerController를 감지하지만 여전히 아무것도 표시되지 않습니다 ... @poetowen
Destiny Dawn

4

iOS 8-팝 오버에 표시 할 해킹없이 UIModalPresentationPopover를 사용할 수 있습니다. 이상적이지는 않지만없는 것보다 낫습니다.

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

편집 : 아마도 다른 UIModalPresentationStyles를 시도하십시오-아마도 더 많은 것이 가로 모드에서 작동 할 것입니다.


3
- (BOOL)shouldAutorotate {
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

This removes the crash.

2

내 문제를 해결 한 또 다른 옵션은 UIImagePickerController의 하위 클래스를 만들고 아래 메서드를 재정의하는 것입니다.

@interface MyImagePickerController ()

@end

@implementation MyImagePickerController

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

UIImagePickerController 대신 이것을 사용하면 모두 잘 작동합니다.


1

카테고리를 생성하면이 버그를 수정하는 데 정말 도움이됩니다. 그리고 생성 된 카테고리를 가져 오는 것을 잊지 마십시오. 이렇게하면 UIImagePickerController에 누락 된 메서드가 추가되고 iOS 6에서는 문서에 btw가 명시되어 있으므로 세로 모드에서만 작동하도록 제한됩니다.

다른 솔루션이 작동했을 수 있습니다. 그러나 iOS 6.1에 배포하기 위해 컴파일 된 iOS 8.x 용 SDK를 사용하면 이것이 갈 길인 것 같습니다.

.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

1

스위프트 3

let imagePicker = UIImagePickerController()

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

present(imagePicker, animated: true)

0

암시 적 으로 반환 값으로 변환 UIInterfaceOrientationPortraitUIInterfaceOrientationMaskPortrait 때이 충돌 문제가 발생했습니다 .

에 대한 더 많은 코드 배경 UIPageViewControllerDelegate, 여러분 모두를 위해 참고하십시오.

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

0

방금 Swift 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
    }
}

답변 해주셔서 감사합니다. 방금 작업 한 코드를 잘라 내고 간단히 리팩토링했습니다.


0

Swift 4 이상에서는 전체 앱이 가로 모드이고 단일 컨트롤러를 세로 모드로 제시해야한다고 가정합니다. 세로 여야하는 뷰 컨트롤러에서 다음을 추가합니다.

override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

open override var shouldAutorotate: Bool {
    return false
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.