Desteklenen yönelimlerin uygulama ile ortak bir yönü yoktur ve Autorotate'in EVET'i döndürmesi gerekir '


94

Uygulamam (iPad; iOS 6) yalnızca yatay bir uygulamadır, ancak fotoğraf kitaplığını görüntülemek için bir UIPopoverController kullanmayı denediğimde şu hatayı atıyor: Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES.Etrafta çok sayıda kodu değiştirmeyi denedim ama hiç şansım olmadı.


1
bir cevabı kabul etmelisin. yardım için çok sayıda insan var ve aynı sorunu yaşayan diğer insanlar için sorununuz için doğru cevabı işaretlediğinizde yardımcı oluyor!
brush51

1
Hayır! iOS 7'de çözüm yok :( (headbang)
AsifHabib

Yanıtlar:


95

IOS6'da üç yerde arayüz yönelimlerini desteklediniz:

  1. .Plist (veya Hedef Özet Ekranı)
  2. UIApplicationDelegate'iniz
  3. Görüntülenen UIViewController

Bu hatayı alıyorsanız, bunun nedeni büyük olasılıkla UIPopover'ınıza yüklediğiniz görünümün yalnızca portre modunu desteklemesidir. Bunun nedeni Game Center, iAd veya kendi görüşünüz olabilir.

Kendi görünümünüzse, UIViewController'ınızda supportedInterfaceOrientations'ı geçersiz kılarak düzeltebilirsiniz:

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

Kendi görünümünüz değilse (iPhone'daki GameCenter gibi), .plist'inizin portre modunu desteklediğinden emin olmanız gerekir. Ayrıca UIApplicationDelegate'inizin portre modunda görüntülenen görünümleri desteklediğinden emin olmanız gerekir. Bunu, .plist'inizi düzenleyerek ve ardından UIApplicationDelegate'inizde supportedInterfaceOrientation öğesini geçersiz kılarak yapabilirsiniz:

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

3
UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRighteşittir UIInterfaceOrientationMaskAllButUpsideDown UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRighteşittirUIInterfaceOrientationMaskLandscape
Valerii Pavlov

4
Veya sadece UIInterfaceOrientationMaskAll kullanın.
Mark Wang

Mükemmel. "Yalnızca dikey" bir açılır pencere yatay modda çalışacak olsa da, mod olarak yalnızca yatay görünüm denetleyicisi sunamaz.
Neal Ehardt 13

Hayır! Çözüm, iOS 7'de çalışmadı :(. Stackoverflow.com/questions/23005351/…
AsifHabib

İOS 8'de çalıştı. Yine de, plist'e portre desteği eklemek zorunda kaldı. Teşekkür ederim.
Yaroslav

65

Alt sınıflara girmekten ve tonlarca kod eklemekten kaçınmanın bir yolunu aramak için çok zaman harcadıktan sonra, işte benim tek satırlık kod çözümüm.

Yeni bir UIImagePickerController kategorisi oluşturun ve

-(BOOL)shouldAutorotate{
    return NO;
}

Hepsi bu kadar!


1
Benim için de çalıştı, tam olarak test etmedim ama şimdiye kadar hile yaptı.
migs647

2
Bu en iyi çözüm gibi görünüyor.
Julian

2
İşler! Bu harika ve bana gerçekten yardımcı oldu. Teşekkürler Dr Luiji !!
Brack

1
Güzel. Benim için iOS 6'da çalışıyor. Tam esneklik için bunu kategoride yapılandırılabilir de yapabilirsiniz.
Jared Egan 13

3
iOS7'de çalışmıyor, kategori yöntemi çağrılmıyor bile (
pch'de

43

Bu hata mesajının görünebileceği başka bir durum var. Sorunu bulana kadar saatlerce arıyordum. Bu ileti dizisi birkaç kez okuduktan sonra çok yardımcı oldu.

Ana görünüm denetleyiciniz yatay yöne döndürülmüşse ve dikey yönde görüntülenmesi gereken özel bir alt görünüm denetleyicisini çalıştırırsanız, bu hata mesajı kodunuz şöyle göründüğünde ortaya çıkabilir:

- (NSUInteger)supportedInterfaceOrientations {

    return UIInterfaceOrientationPortrait;
}

Buradaki tuzak, xcode'un intellisense önerdiği "UIInterfaceOrientationPortrait" idi ve ben umursamadım. İlk bakışta bu doğru görünüyordu.

Doğru maske adlandırılır

UIInterfaceOrientationMaskPortrait

Küçük ek "Maske" nin farkında olun , aksi takdirde alt görünümünüz bir istisna ve yukarıda belirtilen hata mesajıyla sonuçlanacaktır.

Yeni numaralandırmalar biraz kaydırılır. Eski numaralandırmalar geçersiz değerler döndürür!

( UIApplication.h içinde yeni bildirimi görebilirsiniz: UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait) )

Çözüm şudur:

- (BOOL)shouldAutorotate {

    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {

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

    return UIInterfaceOrientationMaskPortrait;
} 

Hızlı kullanımda

override func shouldAutorotate() -> Bool {

    return true
}

override func supportedInterfaceOrientations() -> Int {

    return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}

5
aynı nedenle başıma
Chenxin

Keşke Apple, UIInterfaceOrientationMask dönüş türünü yapsaydı, böylece neyin döndürülmesi gerektiği biraz daha açık hale gelirdi.
LightningStryk

Jackpearse'in cevabı doğru görünüyor. Ancak info.plist'e baktığınızda, UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight ile UISupportedInterfaceOrientations var. Hiçbir MASKE burada
onmyway133

1
@onmyway: Bu doğru, plist değerleri değişmedi. Daha önceki iOS sürümünde, Apple kodun içinde "olmayan" maske değerlerini kullanıyordu. Bu bazı eski şeyler. Şimdi elmanın plist değerlerini dahili olarak biraz değiştirdiğini varsayıyorum.
JackPearse

Uygulamam eskiden Xcode 6.2'nin iPad simülatöründe bu çökme sorunu olmadan çalışıyordu. Ve birkaç gün önce Xcode 6.3'e yükselttikten sonra çöktü. Şimdi bu çözüm sorunumu çözüyor. Çok teşekkür ederim :-)
Altın Başparmak

22

Yalnızca manzara uygulamasında resim seçiciyi sunarken benzer bir sorunla karşılaştım. Dr. Luiji'nin önerdiği gibi, kontrolörümün başına aşağıdaki kategoriyi ekledim.

// 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 dosyanızın @ uygulamasından hemen önce bu satırları eklemek en kolayıdır.


Yalnızca portre uygulamam var! ve Kamerayı Manzara modunda göstermek istiyorum. herhangi bir çözüm?????
AsifHabib

Trausti çalışmadı mı? aynı sorunum var ve kodunuzu denedim ama yine de aynı istisna görünüyor *** Yakalanmamış istisna nedeniyle uygulamayı sonlandırma 'UIApplicationInvalidInterfaceOrientation', nedeni: 'Desteklenen yönlerin uygulama ile ortak bir yönü yoktur veAutorotate EVET'i döndürmeli ..... ... ayrıca UIimagePickerView kategori yöntemine bir kesme noktası koydum, oraya ulaşmalı ve hayır döndürmeli ama yine de bu istisnayı vermeli .... Benim uygulamam sadece Manzara uygulaması ... lütfen bana yardım et
Vishal16

Ayrıca, iOS 8'de tüm uygulama yatay olduğunda SKStoreProductViewController'ı portre olarak göstermeye zorlamak için çalışır. Teşekkürler.
Yaroslav

11

Kodumda aynı hata mesajıyla karşılaşıyordum. Bunu buldum, Apple tarafından bildirilen bir hata:

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

Çözümü, AppDelegate'de düzeltmektir. Ben uyguladım ve benim için çalışıyor!


Bu arada, bunu ilk olarak şu adreste buldum: stackoverflow.com/questions/12522491/…
Robby

Bu doğru cevaptı, doğrudan Apple'dan ve sonra sadece aynı talimatları izlemem gerekiyordu ancak bunu iOS 8'i hedefleyen bir uygulama için Swift'de yapmam gerekiyordu. Her şey harika çalışıyor. AppDelegate, desteklenenInterfaceOrientationsForWindow'u hem Yatay hem de Dikey olarak ayarlar, her bir hızlı dosya kümesini geçersiz kılma işlevi, yalnızca Görünümün dönmemesi için, yalnızca yatay olarak desteklenen Arayüz Yönlendirme işlevini değiştirir, ancak bir dikey görünümün (benim durumumda SKStoreProductViewController) yüklenmesi gerektiğinde çalışır!
RanLearns

Tanrım, önerilen çok fazla çözüm var ve bu açık ara en yüksek noktalara sahip değil, ama gerçekten de doğru olanı. İOS 10 ve 9'da test edilmiştir. Başka hiçbir şey çalışmaz.
Demian Turner

6

Aynı sorunu yaşadım ve bu cevap https://stackoverflow.com/a/12523916 benim için çalışıyor. Daha zarif bir çözüm olup olmadığını merak ediyorum.

Kodum:

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

Bunu yapmayı denedim, ancak kodu çağırmak için düğmeye tıkladığımda ancak hiçbir şey görüntülenmedi, ayrıca @interface NonRotatingUIImagePickerController : UIImagePickerController @end @implementation NonRotatingUIImagePickerController - (BOOL)shouldAutorotate { return NO; } @endkoda eklemeyi denedim , ancak kodum NonRotatingUIImagePickerController'ı algılamadı.
Destiny Dawn

1
Boşver, NonRotatingUIImagePickerController'ı şimdi algılıyor ama hiçbir şey hala görünmüyor ... @poetowen
Destiny Dawn

4

iOS 8 - UIModalPresentationPopover'ı bir açılır pencerede görüntülemek için herhangi bir hacks olmadan kullanabilirsiniz. İdeal değil ama hiç yoktan iyidir.

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

Düzenleme: belki farklı UIModalPresentationStyles'ı deneyin - belki daha fazlası yatayda çalışacaktır.


3
- (BOOL)shouldAutorotate {
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

This removes the crash.

2

Sorunlarımı çözen başka bir seçenek, UIImagePickerController'ın bir alt sınıfını oluşturmak ve aşağıdaki yöntemi geçersiz kılmaktı

@interface MyImagePickerController ()

@end

@implementation MyImagePickerController

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

UIImagePickerController yerine bunu kullanın ve hepsi iyi çalışıyor.


1

Bir kategori oluşturmak bu hatayı düzeltmek için gerçekten yararlıdır. Oluşturduğunuz kategoriyi içe aktarmayı unutmayın. Bu, eksik yöntemi UIImagePickerController'a ekleyecek ve iOS 6'da, dokümantasyon btw'yi belirttiği için onu yalnızca Portrait'de çalışmak üzere kısıtlayacaktır.

Diğer çözümler işe yaramış olabilir. Ancak, iOS 6.1'de dağıtılmak üzere derlenen iOS 8.x için SDK ile gidilecek yol budur.

.H dosyası:

#import <UIKit/UIKit.h>

@interface UIImagePickerController (iOS6FIX)

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

@end

.M dosyası:

#import "UIImagePickerController+iOS6FIX.h"

@implementation UIImagePickerController (iOS6FIX)

- (BOOL) shouldAutorotate {
    return NO;
}

- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

@end

1

Hızlı 3

let imagePicker = UIImagePickerController()

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

present(imagePicker, animated: true)

0

Ne zaman bu kilitlenme sorunu yaşamıştır dönüştürme UIInterfaceOrientationPortraitiçin UIInterfaceOrientationMaskPortraitörtülü bir dönüş değeri olarak.

Daha fazla kod arka planı UIPageViewControllerDelegate, hepiniz için sadece FYI.

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

0

Swift 4.x için sorunu çözdüm

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

Cevaplarınız için de teşekkür ederim. Sadece çalışılan kodu kestim ve basitçe yeniden düzenledim.


0

Swift 4 ve üstü, tüm uygulamanın yatay durumda olduğunu ve dikey olarak tek bir kumanda göstermeniz gerektiğini varsayarsak. Dikey olması gereken görünüm denetleyicisine aşağıdakileri ekleyin:

override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

open override var shouldAutorotate: Bool {
    return false
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.