webentwicklung-frage-antwort-db.com.de

Unterstützte Ausrichtungen haben mit der Anwendung keine gemeinsame Ausrichtung, und shouldAutorotate gibt YES zurück.

Meine App (iPad; iOS 6) ist eine reine Querformatanwendung. Wenn ich jedoch versuche, die Fotobibliothek mit einem UIPopoverController anzuzeigen, wird der folgende Fehler ausgegeben: Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES. Ich habe versucht, eine Menge Code zu ändern, aber ich hatte kein Glück.

90
Destiny Dawn

In IOS6 haben Sie Schnittstellenorientierungen an drei Stellen unterstützt:

  1. Die .plist (oder Zielzusammenfassung)
  2. Ihr UIApplicationDelegate
  3. Der angezeigte UIViewController

Wenn Sie diese Fehlermeldung erhalten, liegt das wahrscheinlich daran, dass die Ansicht, die Sie in Ihr UIPopover laden, nur den Hochformatmodus unterstützt. Dies kann durch Game Center, iAd oder Ihre eigene Ansicht verursacht werden.

Wenn es sich um Ihre eigene Ansicht handelt, können Sie dies beheben, indem Sie die unterstützten Schnittstellen-Orientierungen auf Ihrem UIViewController überschreiben:

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

Wenn es sich nicht um Ihre eigene Ansicht handelt (wie z. B. GameCenter auf dem iPhone), müssen Sie sicherstellen, dass Ihre .plist den Hochformatmodus unterstützt. Sie müssen auch sicherstellen, dass Ihr UIApplicationDelegate Ansichten unterstützt, die im Hochformat angezeigt werden. Sie können dies tun, indem Sie Ihre .plist-Datei bearbeiten und dann die unterstützte Schnittstelle auf Ihrem UIApplicationDelegate überschreiben:

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

Nachdem ich viel Zeit damit verbracht habe, nach einer Möglichkeit zu suchen, um Unterklassen zu vermeiden und eine Menge Code hinzuzufügen, hier ist meine Einzeilen-Code-Lösung.

Erstellen Sie eine neue UIImagePickerController-Kategorie und fügen Sie sie hinzu

-(BOOL)shouldAutorotate{
    return NO;
}

Das war's Leute!

64
Dr.Luiji

In einem anderen Fall kann diese Fehlermeldung angezeigt werden. Ich habe stundenlang gesucht, bis ich das Problem gefunden habe. Dieser Thread war nach mehrmaligem Lesen sehr hilfreich.

Wenn Ihr Hauptansichts-Controller in Querformat gedreht ist und Sie einen benutzerdefinierten Unteransichts-Controller aufrufen, der im Hochformat angezeigt werden soll, kann diese Fehlermeldung auftreten, wenn Ihr Code folgendermaßen aussieht:

- (NSUInteger)supportedInterfaceOrientations {

    return UIInterfaceOrientationPortrait;
}

Die Falle hier war, dass xcodes Intellisense "UIInterfaceOrientationPortrait" vorschlug und es mir egal war. Auf den ersten Blick schien dies richtig zu sein.

Die richtige Maske heißt

UIInterfaceOrientationMaskPortrait

Beachten Sie das kleine Infix "Maske", da Ihre Unteransicht sonst mit einer Ausnahme und der oben genannten Fehlermeldung endet.

Die neuen Aufzählungen sind etwas verschoben. Die alten Aufzählungen geben ungültige Werte zurück!

(In UIApplication.h sehen Sie die neue Deklaration: UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait) )

Die Lösung ist:

- (BOOL)shouldAutorotate {

    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {

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

    return UIInterfaceOrientationMaskPortrait;
} 

In Swift verwenden

override func shouldAutorotate() -> Bool {

    return true
}

override func supportedInterfaceOrientations() -> Int {

    return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
43
JackPearse

Ich hatte ein ähnliches Problem, als ich den Image Picker in einer Landscape-Only-App präsentierte. Wie von Dr. Luiji vorgeschlagen, habe ich die folgende Kategorie am Anfang meines Controllers hinzugefügt.

// 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

Am einfachsten fügen Sie diese Zeilen direkt vor der @Implementierung Ihrer ViewController .m-Datei hinzu.

22

In meinem Code ist dieselbe Fehlermeldung aufgetreten. Ich fand das, es ist ein Fehler, wie von Apple berichtet:

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

Seine Lösung besteht darin, dies im AppDelegate zu beheben. Ich habe es implementiert und es funktioniert für mich!

11
Robby

Ich hatte das gleiche Problem und diese Antwort https://stackoverflow.com/a/12523916 funktioniert bei mir. Ich frage mich, ob es eine elegantere Lösung gibt.

Mein Code:

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

iOS 8 - Sie können UIModalPresentationPopover ohne Hacks zum Anzeigen in einem Popover verwenden. Nicht ideal, aber besser als nichts.

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

Bearbeiten: Probieren Sie vielleicht die verschiedenen UIModalPresentationStyles aus - vielleicht funktionieren mehr im Querformat.

4
derbs
- (BOOL)shouldAutorotate {
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

This removes the crash.
3
Suhail Bhat

Eine andere Option, die meine Probleme behebt, war das Erstellen einer Unterklasse des UIImagePickerController und das Überschreiben der folgenden Methode

@interface MyImagePickerController ()

@end

@implementation MyImagePickerController

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

Verwenden Sie dies anstelle des UIImagePickerControllers und alles funktioniert einwandfrei.

2
EquiAvia Tech

Das Erstellen einer Kategorie ist sehr hilfreich, um diesen Fehler zu beheben. Und vergessen Sie nicht, Ihre erstellte Kategorie zu importieren. Dadurch wird die fehlende Methode zu UIImagePickerController hinzugefügt und unter iOS 6 auf die Verwendung in Portrait beschränkt, sofern in der Dokumentation nicht anders angegeben.

Die anderen Lösungen haben möglicherweise funktioniert. Aber mit SDK für iOS 8.x, das für die Bereitstellung unter iOS 6.1 kompiliert wurde, scheint dies der richtige Weg zu sein.

Die .h-Datei:

#import <UIKit/UIKit.h>

@interface UIImagePickerController (iOS6FIX)

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

@end

Die .m-Datei:

#import "UIImagePickerController+iOS6FIX.h"

@implementation UIImagePickerController (iOS6FIX)

- (BOOL) shouldAutorotate {
    return NO;
}

- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

@end
1
Helge Staedtler

Swift

let imagePicker = UIImagePickerController()

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

present(imagePicker, animated: true)
1
zombie

Ich habe gerade das Problem für Swift 4.x behoben

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

Vielen Dank auch für eure Antworten. Ich habe gerade den bearbeiteten Code geschnitten und ihn einfach überarbeitet.

0
atereshkov

Swift 4 und höher, vorausgesetzt, die gesamte App befindet sich im Querformat und Sie müssen einen einzelnen Controller im Hochformat präsentieren. Fügen Sie im Ansichtscontroller, der im Hochformat sein muss, Folgendes hinzu:

override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

open override var shouldAutorotate: Bool {
    return false
}
0
Gal Blank

Ich bin auf dieses Absturzproblem gestoßen, als UIInterfaceOrientationPortrait implizit in UIInterfaceOrientationMaskPortrait konvertiert als Rückgabewert.

Mehr Code-Hintergrund zu UIPageViewControllerDelegate, nur zu Ihrer Information.

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