Unterstützte Ausrichtungen haben keine gemeinsame Ausrichtung mit der Anwendung, und sollteAutorotate JA zurückgeben '

92

Meine App (iPad; iOS 6) ist eine reine Landschaftsanwendung. 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, einen Großteil des Codes zu ändern, hatte aber kein Glück.

Destiny Dawn
quelle
1
Sie sollten eine Antwort akzeptieren. Es gibt viele Menschen, die Hilfe benötigen, und für andere Menschen, die das gleiche Problem haben, hilft es, wenn Sie die richtige Antwort für Ihr Problem markieren!
Pinsel 51
1
Nein! Keine Lösung funktioniert unter iOS 7 :( (Headbang)
AsifHabib
Beste Antwort hier stackoverflow.com/questions/20468335/…
Damien Romito

Antworten:

94

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

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

Wenn Sie diesen Fehler erhalten, liegt dies höchstwahrscheinlich daran, dass die Ansicht, die Sie in Ihrem 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 InterfaceOrientations 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 (z. B. GameCenter auf dem iPhone), müssen Sie sicherstellen, dass Ihre .plist den Porträtmodus 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 bearbeiten und dann die unterstützte InterfaceOrientation in Ihrem UIApplicationDelegate überschreiben:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
Snickers
quelle
3
UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRightgleich UIInterfaceOrientationMaskAllButUpsideDown UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRightgleichUIInterfaceOrientationMaskLandscape
Valerii Pavlov
4
Oder verwenden Sie einfach UIInterfaceOrientationMaskAll.
Mark Wang
Perfekt. Obwohl ein Popover "nur im Hochformat" im Querformat funktioniert, kann ein Nur-Querformat-Ansichts-Controller nicht modal dargestellt werden.
Neal Ehardt
Nein! Lösung funktionierte nicht unter iOS 7 :(. Stackoverflow.com/questions/23005351/…
AsifHabib
Arbeitete unter iOS 8. Allerdings musste Plist Unterstützung für Hochformat hinzufügen. Danke dir.
Jaroslaw
65

Nachdem ich viel Zeit damit verbracht habe, nach einer Möglichkeit zu suchen, Unterklassen zu vermeiden und tonnenweise Code hinzuzufügen, ist hier meine einzeilige Codelösung.

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

-(BOOL)shouldAutorotate{
    return NO;
}

Das war's Leute!

Dr. Luiji
quelle
1
Hat auch für mich funktioniert, noch nicht vollständig getestet, scheint aber den Trick bisher zu tun.
migs647
2
Dies scheint die beste Lösung zu sein.
Julian
2
Funktioniert! Das ist großartig und hat mir zur Not wirklich geholfen. Danke Dr. Luiji !!
Brack
1
Nett. Funktioniert für mich unter iOS 6. Sie können dies auch in der Kategorie für volle Flexibilität konfigurierbar machen.
Jared Egan
3
funktioniert nicht in iOS7, die Kategoriemethode wird nicht einmal aufgerufen (obwohl in der pch enthalten)
Peter Lapisu
43

In einem anderen Fall kann diese Fehlermeldung angezeigt werden. Ich habe stundenlang gesucht, bis ich das Problem gefunden habe. Dieser Thread war sehr hilfreich, nachdem ich ihn einige Male gelesen hatte.

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 xcodes Intellisense schlug "UIInterfaceOrientationPortrait" vor und es war mir egal. Auf den ersten Blick schien dies richtig zu sein.

Die richtige Maske heißt

UIInterfaceOrientationMaskPortrait

Beachten Sie das kleine Infix "Maske" , da sonst in Ihrer Unteransicht eine Ausnahme und die oben genannte Fehlermeldung angezeigt werden.

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

Im schnellen Einsatz

override func shouldAutorotate() -> Bool {

    return true
}

override func supportedInterfaceOrientations() -> Int {

    return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
JackPearse
quelle
5
passierte mir aus dem gleichen Grund
ChenXin
Ich wünschte, Apple hätte nur den Rückgabetyp UIInterfaceOrientationMask erstellt, damit etwas offensichtlicher ist, was zurückgegeben werden muss.
LightningStryk
Jackpearses Antwort sieht richtig aus. Wenn Sie jedoch in die info.plist schauen, gibt es UISupportedInterfaceOrientations mit UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight. Keine MASKE hier
onmyway133
1
@onmyway: Das stimmt, die Plist-Werte haben sich nicht geändert. In der vorherigen iOS-Version verwendete Apple die "Nicht" -Maskenwerte im Code. Dies ist ein Vermächtnis. Ich gehe davon aus, dass Apple die Plist-Werte jetzt intern etwas verschiebt.
JackPearse
Meine App funktionierte früher ohne dieses Absturzproblem auf einem iPad-Simulator von Xcode 6.2. Und es stürzte ab, nachdem ich vor ein paar Tagen auf Xcode 6.3 aktualisiert hatte. Jetzt behebt diese Lösung mein Problem. Vielen Dank :-)
Golden Thumb
22

Ich hatte ein ähnliches Problem, als ich die Bildauswahl in einer App nur für Landschaften präsentierte. Wie von Dr. Luiji vorgeschlagen, habe ich am Anfang meines Controllers die folgende Kategorie 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

Es ist am einfachsten, diese Zeilen unmittelbar vor der Implementierung Ihrer ViewController .m-Datei hinzuzufügen.

Trausti Kristjansson
quelle
Ich habe nur eine Porträt-App! und ich möchte die Kamera im Querformat anzeigen. irgendeine Lösung?????
AsifHabib
Trausti hat nicht funktioniert? Ich habe das gleiche Problem und habe Ihren Code ausprobiert, aber es erscheint immer noch die gleiche Ausnahme. *** Beenden der App aufgrund der nicht erfassten Ausnahme 'UIApplicationInvalidInterfaceOrientation', Grund: 'Unterstützte Orientierungen haben keine gemeinsame Orientierung mit der Anwendung, und sollteAutorotate JA zurückgeben ..... ... Ich habe auch einen Haltepunkt für die UIimagePickerView-Kategoriemethode gesetzt. SollteAutorotate dort ankommen und gibt nein zurück, gibt aber trotzdem diese Ausnahme aus. Meine App ist nur eine Landschafts-App ... Bitte helfen Sie mir
Vishal16
Erzwingt auch, dass SKStoreProductViewController im Hochformat angezeigt wird, wenn die gesamte App in iOS 8 im Querformat angezeigt wird. Vielen Dank.
Jaroslaw
11

In meinem Code ist dieselbe Fehlermeldung aufgetreten. Ich habe dies gefunden, es ist ein Fehler, wie von Apple gemeldet:

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

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

Robby
quelle
Übrigens fand ich dies ursprünglich unter: stackoverflow.com/questions/12522491/…
Robby
Dies war die richtige Antwort, direkt von Apple, und dann musste ich nur die gleichen Anweisungen befolgen, aber in Swift für eine App für iOS 8. Alles funktioniert hervorragend. AppDelegate setzt unterstütztInterfaceOrientationsForWindow auf Landscape und Portrait. Alle einzelnen schnellen Dateigruppen überschreiben nur func supportInterfaceOrientations auf Landscape, damit die Ansicht nicht gedreht wird. Wenn jedoch eine Hochformatansicht (in meinem Fall SKStoreProductViewController) geladen werden muss, funktioniert sie!
RanLearns
Meine Güte, es gibt so viele Lösungsvorschläge, und dieser hat bei weitem nicht die höchsten Punkte, aber er ist in der Tat der richtige. Getestet auf iOS 10 und 9. Sonst funktioniert nichts.
Demian Turner
6

Ich hatte das gleiche Problem und diese Antwort https://stackoverflow.com/a/12523916 funktioniert für mich. 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];
poetowen
quelle
Ich habe versucht, dies zu tun, aber wenn ich auf die Schaltfläche @interface NonRotatingUIImagePickerController : UIImagePickerController @end @implementation NonRotatingUIImagePickerController - (BOOL)shouldAutorotate { return NO; } @endklicke , um den Code aufzurufen, aber nichts angezeigt wird, habe ich auch versucht , dem Code etwas hinzuzufügen , aber mein Code hat NonRotatingUIImagePickerController nicht erkannt.
Destiny Dawn
1
Egal, es erkennt jetzt NonRotatingUIImagePickerController, aber es wird immer noch nichts angezeigt ... @poetowen
Destiny Dawn
4

iOS 8 - Sie können UIModalPresentationPopover ohne Hacks verwenden, um es in einem Popover anzuzeigen. 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.

derbs
quelle
3
- (BOOL)shouldAutorotate {
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

This removes the crash.
Suhail Bhat
quelle
2

Eine weitere Option, mit der meine Probleme behoben wurden, bestand darin, eine Unterklasse des UIImagePickerController zu erstellen und die folgende Methode zu überschreiben

@interface MyImagePickerController ()

@end

@implementation MyImagePickerController

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

Verwenden Sie dies anstelle des UIImagePickerController und alles funktioniert einwandfrei.

EquiAvia Tech
quelle
1

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 wird die Verwendung in Portrait nur eingeschränkt, wie in der Dokumentation angegeben.

Die anderen Lösungen haben möglicherweise funktioniert. Mit SDK für iOS 8.x, das für die Bereitstellung unter iOS 6.1 kompiliert wurde, scheint dies jedoch 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
Helge Staedtler
quelle
1

Swift 3

let imagePicker = UIImagePickerController()

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

present(imagePicker, animated: true)
Zombie
quelle
0

Ich traf diesen Absturz Problem beim Konvertieren UIInterfaceOrientationPortraitzu UIInterfaceOrientationMaskPortraitimplizit als Rückgabewert.

Mehr Code-Hintergrund auf UIPageViewControllerDelegate, nur zu Ihrer Information für Sie alle.

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

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.

atereshkov
quelle
0

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

override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

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