내 앱 (iPad; iOS 6)은 가로 전용 응용 프로그램이지만 UIPopoverController를 사용하여 사진 라이브러리를 표시하려고하면이 오류가 발생합니다.
Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES.
많은 코드를 변경해 보았지만 운이 없었습니다.
답변
IOS6에서는 세 곳에서 인터페이스 방향을 지원했습니다.
- .plist (또는 대상 요약 화면)
- UIApplicationDelegate
- 표시되는 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;
}
답변
서브 클래 싱을 피하고 수많은 코드를 추가하는 방법을 찾는 데 많은 시간을 보낸 후, 여기에 한 줄 코드 솔루션이 있습니다.
새로운 UIImagePickerController의 카테고리를 만들고 추가
-(BOOL)shouldAutorotate{
return NO;
}
그게 다야!
답변
이 오류 메시지가 나타날 수있는 또 다른 경우가 있습니다. 나는 문제를 발견 할 때까지 몇 시간을 찾고 있었다. 이 스레드는 몇 번 읽은 후 매우 유용했습니다.
메인 뷰 컨트롤러가 가로 방향으로 회전하고 세로 방향으로 표시되어야하는 사용자 지정 하위 뷰 컨트롤러를 호출하는 경우 코드가 다음과 같을 때이 오류 메시지가 발생할 수 있습니다.
- (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)
}
답변
가로 전용 앱에서 이미지 선택기를 표시 할 때 비슷한 문제가 발생했습니다. 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 바로 앞에 이러한 줄을 추가하는 것이 가장 쉽습니다.
답변
내 코드에서 동일한 오류 메시지가 발생했습니다. 나는 이것을 발견했다. 그것은 애플이보고 한 버그이다.
https://devforums.apple.com/message/731764#731764
그의 해결책은 AppDelegate에서 수정하는 것입니다. 나는 그것을 구현했고 그것은 나를 위해 작동합니다!
답변
나는 같은 문제가 있었고이 답변 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];
답변
iOS 8-팝 오버에 표시 할 해킹없이 UIModalPresentationPopover를 사용할 수 있습니다. 이상적이지는 않지만없는 것보다 낫습니다.
imagePicker.modalPresentationStyle = UIModalPresentationPopover;
imagePicker.popoverPresentationController.sourceView = self.view;
imagePicker.popoverPresentationController.sourceRect = ((UIButton *)sender).frame;
편집 : 아마도 다른 UIModalPresentationStyles를 시도하십시오-아마도 더 많은 것이 가로 모드에서 작동 할 것입니다.