내 앱 (iPad; iOS 6)은 가로 전용 응용 프로그램이지만 UIPopoverController를 사용하여 사진 라이브러리를 표시하려고하면이 오류가 발생합니다.
Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES.
많은 코드를 변경해 보았지만 운이 없었습니다.
내 앱 (iPad; iOS 6)은 가로 전용 응용 프로그램이지만 UIPopoverController를 사용하여 사진 라이브러리를 표시하려고하면이 오류가 발생합니다.
Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES.
많은 코드를 변경해 보았지만 운이 없었습니다.
답변:
IOS6에서는 세 곳에서 인터페이스 방향을 지원했습니다.
이 오류가 발생하면 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;
}
UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight
동일 UIInterfaceOrientationMaskAllButUpsideDown
UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight
같음UIInterfaceOrientationMaskLandscape
서브 클래 싱을 피하고 수많은 코드를 추가하는 방법을 찾는 데 많은 시간을 보낸 후, 여기에 한 줄 코드 솔루션이 있습니다.
새로운 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];
@interface NonRotatingUIImagePickerController : UIImagePickerController @end @implementation NonRotatingUIImagePickerController - (BOOL)shouldAutorotate { return NO; } @end
되지 않았을 때 코드에 추가하려고 시도 했지만 내 코드가 NonRotatingUIImagePickerController를 감지하지 못했습니다.
iOS 8-팝 오버에 표시 할 해킹없이 UIModalPresentationPopover를 사용할 수 있습니다. 이상적이지는 않지만없는 것보다 낫습니다.
imagePicker.modalPresentationStyle = UIModalPresentationPopover;
imagePicker.popoverPresentationController.sourceView = self.view;
imagePicker.popoverPresentationController.sourceRect = ((UIButton *)sender).frame;
편집 : 아마도 다른 UIModalPresentationStyles를 시도하십시오-아마도 더 많은 것이 가로 모드에서 작동 할 것입니다.
내 문제를 해결 한 또 다른 옵션은 UIImagePickerController의 하위 클래스를 만들고 아래 메서드를 재정의하는 것입니다.
@interface MyImagePickerController ()
@end
@implementation MyImagePickerController
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
UIImagePickerController 대신 이것을 사용하면 모두 잘 작동합니다.
카테고리를 생성하면이 버그를 수정하는 데 정말 도움이됩니다. 그리고 생성 된 카테고리를 가져 오는 것을 잊지 마십시오. 이렇게하면 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
암시 적 으로 반환 값으로 변환 UIInterfaceOrientationPortrait
할UIInterfaceOrientationMaskPortrait
때이 충돌 문제가 발생했습니다 .
에 대한 더 많은 코드 배경 UIPageViewControllerDelegate
, 여러분 모두를 위해 참고하십시오.
-(UIInterfaceOrientationMask)pageViewControllerSupportedInterfaceOrientations:
(UIPageViewController *)pageViewController
{
# return UIInterfaceOrientationPortrait; # wrong
return UIInterfaceOrientationMaskPortrait; # correct
}
방금 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
}
}
답변 해주셔서 감사합니다. 방금 작업 한 코드를 잘라 내고 간단히 리팩토링했습니다.