iOS 6: Bazı görünümleri dikey olarak nasıl kısıtlayabilirim ve diğerlerinin dönmesine izin verebilirim?


99

UINavigationControllerDetaya inme arayüzü sunmak için a kullanan bir iPhone uygulamam var : İlk olarak bir görünüm, sonra diğeri, dört seviyeye kadar derinlik. İlk üç görünümün dikey yönelimle sınırlandırılmasını ve yalnızca son görüntünün yataya döndürülmesine izin verilmesini istiyorum. Dördüncü görünümden üçüncü ve dördüncü görünüm yatay yöndeyken döndüğümde, her şeyin tekrar portreye dönmesini istiyorum.

İOS 5'te shouldAutorotateToInterfaceOrientation:, izin verilen yönler için EVET'i döndürmek için görünüm denetleyicilerimin her birinde tanımladım . Her şey yukarıda açıklandığı gibi çalıştı, cihaz yatay yönde 4 numaralı denetleyiciden 3 numaralı düzeye dönüldüğünde bile portreye dönüş dahil.

İOS 6'da tüm görünüm denetleyicileri, amaçlanmayanları bozarak yatay konuma döner. İOS 6 sürüm notları şunu söylüyor:

Daha fazla sorumluluk, uygulamaya ve uygulama temsilcisine taşınmaktır. Artık iOS kapsayıcıları (gibi UINavigationController), otomatik döndürme yapmaları gerekip gerekmediğini belirlemek için çocuklarına danışmıyor. [...] Sistem, aygıt döndüğünde veya tam ekran modal sunum stiliyle bir görünüm denetleyicisi sunulduğunda, en üstteki tam ekran görünüm denetleyicisinden (genellikle kök görünüm denetleyicisinden) desteklenen arabirim yönlerini ister. Ayrıca, desteklenen yönler yalnızca bu görünüm denetleyicisi shouldAutorotateyönteminden YES döndürürse alınır . [...] Sistem, uygulamanın supportedInterfaceOrientationsForWindow:yöntemi tarafından döndürülen değerle supportedInterfaceOrientationsen üstteki tam ekran denetleyicinin yönteminin döndürdüğü değerle kesişerek bir yönün desteklenip desteklenmediğini belirler .

Bu yüzden alt sınıfa ayırdım UINavigationController, MainNavigationControllerbir boole özelliği verdim landscapeOKve izin verilen yönelimleri döndürmek için bunu kullandım supportedInterfaceOrientations. Sonra her bir görünüm denetleyicilerimin viewWillAppear:yöntemlerinde buna benzer bir satır var

    [(MainNavigationController*)[self navigationController] setLandscapeOK:YES];

bana MainNavigationControlleristenen davranışı anlatmak için.

İşte soru geliyor: Şimdi dikey modda dördüncü görünümüme gidersem ve telefonu ters çevirirsem, yatay konuma döner. Şimdi sadece portre çalışması gereken üçüncü görünüme dönmek için geri düğmesine basıyorum. Ama geri dönmüyor. Bunu nasıl yapmasını sağlarım?

denedim

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]

içinde viewWillAppearbenim üçüncü görünümü denetleyicisi yöntemine, ancak hiçbir şey yapmaz. Bu, aramak için yanlış bir yöntem mi yoksa onu aramak için yanlış bir yer mi yoksa her şeyi tamamen farklı bir şekilde mi uygulamalıyım?

Yanıtlar:


95

Aynı sorunu yaşadım ve benim için çalışan bir çözüm buldum. Çalışması için, UINavigationController'ınıza uygulamak yeterli değildir- (NSUInteger)supportedInterfaceOrientations . Ayrıca bu yöntemi, kontrolör # 4'ü patlattıktan sonra yalnızca portre olan ilk kontrolör # 3'te uygulamanız gerekir. Bu yüzden, UINavigationController'ımda aşağıdaki koda sahibim:

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    if (self.isLandscapeOK) {
        // for iPhone, you could also return UIInterfaceOrientationMaskAllButUpsideDown
        return UIInterfaceOrientationMaskAll;
    }
    return UIInterfaceOrientationMaskPortrait;
}

Görünüm denetleyicisinde # 3, aşağıdakileri ekleyin:

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

1, 2 ve 4 numaralı görünüm denetleyicilerinize herhangi bir şey eklemenize gerek yoktur. Bu benim için çalışıyor, umarım size yardımcı olur.


8
insanların aylardır çözmeye çalıştığı bir şeyi çözdün! bunun için çok övgüyü hak ediyorsun! UIViewController'daki bir kategoriye supportedInterfaceOrientations'ı ekledim ve yalnızca portre içeren denetleyiciler için varsayılan olarak mükemmel çalışıyor.
dwery

3
SO'daki 100 farklı cevap arasında gerçekten işe yarayan cevap budur. Teşekkürler :-)
Christer Nordvik

16
Bunu ayarladım ve GERİ DÖNÜŞÜNDE, yalnızca yatay ile sınırlı bir görünüm denetleyicisine giderken yanlış yönelim alıyorum. Manzaraya otomatik olarak dönmüyor - Hala gören başka biri var mı?
Oded Ben Dov

1
Ya istenen yatay görünüm denetleyicisi bir segmentten sunuluyorsa ve gezinme denetleyicisi yoksa?
jesses.co.tt

1
Sonuncuyu dönüş türü olarak NSUInteger olacak şekilde düzenleyin.
2014

68

CustomNavigationController ekleyin

İçinde şu yöntemleri geçersiz kılın:

-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

Şimdi plistteki tüm yönleri ekleyin

görüntü açıklamasını buraya girin

Görünüm denetleyicisinde yalnızca gerekli olanları ekleyin:

-(BOOL)shouldAutorotate
{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

bu yöntemler gezinti denetleyicisi yöntemlerini geçersiz kılar


5
Bu cevapla gerçekten başardın! Çok teşekkür ederim. Gerçekten çok yardımcı oldun. Bu bir süredir benim için büyük bir sorun oldu. İyi iş.
K2Digital

Teşekkür ederim! Bunu anlamak için çok zaman ve enerji harcadım!
bkbeachlabs

Sen hayat kurtarıcısın .... Bu benim uygulamamda da çalışıyor. Aslında uygulamamda istediğim şey, hepsinin ViewControllerPortre modunda olması ve benim ViewControllerde Landscap & Portrait modunda olması. Ayrıca hem iOS 5.0 hem de iOS 6.0'da destek veriyorum. Bu yüzden kafa karıştırıyorum ama bu harika bir çözüm. i eklemek CustomNavigationController benim ihtiyaçlarına göre benim kök görünümü denetleyicisi ve vermek desteği. Tekrar teşekkürler.
Bhavin_m

Fantastik. Tam olarak ihtiyacım olan şey. Teşekkür ederim.
mszaro

Ya istenen yatay görünüm denetleyicisi bir segmentten sunuluyorsa ve gezinme denetleyicisi yoksa?
jesses.co.tt

9

SO ile ilgili sayısız benzer sorudaki her yanıta baktıktan sonra, yanıtların hiçbiri benim için işe yaramadı, ancak bana bazı fikirler verdiler. Problemi şu şekilde çözdüm:

Öncelikle, projenizin hedefindeki Desteklenen Arayüz Oryantasyonlarınızın dönen görünümünüz için istediğiniz tüm oryantasyonları içerdiğinden emin olun.

görüntü açıklamasını buraya girin

Ardından, bir kategori oluşturun UINavigationController(Apple alt sınıflara almamayı söylediği için):

@implementation UINavigationController (iOS6AutorotationFix)

-(BOOL)shouldAutorotate {
    return [self.topViewController shouldAutorotate];
}

@end

Döndürmek istediğiniz bu kategoriyi ve görünüm denetleyicisini (bunu arayacağım RotatingViewController) gezinme denetleyicinizi içermesi gereken en üst düzey görünüm denetleyicinize aktarın. Bu görünüm denetleyicisinde shouldAutorotateaşağıdaki gibi uygulayın . Bunun döndürmek istediğiniz görünüm denetleyicisi olmamasına dikkat edin.

-(BOOL)shouldAutorotate {

    BOOL shouldRotate = NO;

    if ([navigationController.topViewController isMemberOfClass:[RotatingViewController class]] ) {
        shouldRotate = [navigationController.topViewController shouldAutorotate];
    }

    return shouldRotate;
}

Son olarak, RotatingViewControlleruygulamanızda shouldAutorotateve supportedInterfaceOrientationsaşağıdaki gibi uygulayın :

-(BOOL)shouldAutorotate {
    // Preparations to rotate view go here
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown; // or however you want to rotate
}

Bunu yapmanız gerekmesinin nedeni, iOS 6'nın üstten görünüm denetleyicisi yerine kök görünüm denetleyicisine dönüş denetimi vermesidir. Tek bir görünümün dönüşünün yığındaki diğer görünümlerden farklı davranmasını istiyorsanız, kök görünüm denetleyicisinde bunun için belirli bir durum yazmanız gerekir.


2
Bu, daha fazla sevgiyi hak eden mükemmel bir cevap. Burada başka hiçbir yerde bulamadığım ve kritik önem taşıyan bilgi parçası şu şekildedir: Bireysel bir görünümün dönüşünün yığındaki diğer görünümlerden farklı davranmasını istiyorsanız, bunun için kökte özel bir durum yazmanız gerekir. view controller
shmim

Sanırım bu, uygulamanızın storyboard'unun ilk denetleyicisi olarak ilk üyesi olarak bir navigationController'a sahipseniz işe yarayacaktır, ancak ilk denetleyici basitçe bir ViewController olduğunda durum ne olacak?
Duck

4

@ Brian'ın cevabına yorum yapacak kadar itibarım yok, bu yüzden notumu buraya ekleyeceğim.

Brian, iOS6'nın rotasyon kontrolünü rootViewController'a verdiğinden bahsetti - bu sadece belirtildiği gibi bir UINavigationController değil, aynı zamanda benim için bir UITabBarController de olabilirdi. Yapım şuna benziyor:

  • UITabBarController
    • UINavigationController
      • UIViewControllers ...
    • UINavigationController
      • UIViewControllers ...

Bu yüzden yöntemleri önce özel bir UITabBarController'a, sonra özel bir UINavigationController'a ve son olarak da belirli UIViewController'a ekledim.

UITabBarController ve UINavigationController'dan örnek:

- (BOOL)shouldAutorotate {
    return [self.viewControllers.lastObject shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations {
    return [self.viewControllers.lastObject supportedInterfaceOrientations];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return [self.viewControllers.lastObject shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation];
}

Aslında, kök görünüm denetleyicimde örnek değişkeni olarak bir UITabBarController kullandım çünkü 6.0'dan önceki iOS sürümlerinde UITabBarController'ı alt sınıflara ayırmanız gerekmiyordu ve iOS 5.0'a geri dönmem gerekiyordu.
Brian

@micmdk Aynı problemim var. lütfen nasıl çözüleceğini önerin, kodunuzu kopyaladım ve özel Gezinme Denetleyicisine ve customUabbarController'a koydum ve diğer görünüm denetleyicisini Brian's Guided olarak ayarladım. ancak yine de dikeyde sabit görünüm denetleyicisi almıyor.
Ram S

@Brian Bende de aynı sorun var. lütfen nasıl çözüleceğini önerin, kodunuzu kopyaladım ve özel Gezinme Denetleyicisine ve customUabbarController'a koydum ve diğer görünüm denetleyicisini Micmdk's Guided olarak ayarladım. ancak hala ios8'de dikeyde sabit görünüm denetleyicisi almıyor.
Ram S

3

Kendi soruma kısmi bir cevap vermek istiyorum. Çalışmak için viewWillAppearüçüncü yöntemimde kullanılan aşağıdaki kod satırını buldum UIViewController:

[[UIDevice currentDevice] 
      performSelector:NSSelectorFromString(@"setOrientation:") 
           withObject:(id)UIInterfaceOrientationPortrait];

Ama bu çözümü gerçekten sevmiyorum. Apple belgelerine göre fiziksel özellikleri temsil eden salt okunur bir özelliğe atamak için bir hile kullanıyor aygıtın yönünü . Bu, iPhone'a kullanıcının elindeki doğru yöne atlamasını söylemek gibi.

Basitçe çalıştığı için bunu uygulamamda bırakmak çok cazip. Ama bu doğru gelmiyor, bu yüzden temiz bir çözüm için soruyu açık bırakmak istiyorum.


4
Uygulamanızı orada bırakırsanız büyük olasılıkla reddedilecektir. Ben de buna çözüm arıyorum ama mümkün değil gibi görünüyor. Bulabildiğim tek şey bu sorunun cevabı: stackoverflow.com/questions/7196300/… işe yarıyor ama bir nedenden ötürü görüntü denetleyicilerimden birinde düğme dokunuşunu kırıyor
Lope

Şansımı denedim ve Apple'a teslim oldum. Hâlâ incelenmeyi bekliyorum ... Sizi haberdar edeceğim.
Harald Bögeholz

Apple, uygulamamı bu hack ile yerinde onayladı, evet! Umarım gelecekteki bir iOS güncellemesinde bana geri tepmez. Bu arada, temiz bir çözüm için önerilere açığım!
Harald Bögeholz

1
@ HaraldBögeholz Grt suggetion. ama ARC ile yeni xCode'da çalışırken ans kullanamıyorum. "NSInteger'ın (aka int) ARC PerformSelector ile id'ye atılmasına izin verilmiyor, seçicisi bilinmediği için bir sızıntıya neden olabilir" mesajı alıyorum bunu nasıl çözebilirim? Bir çözüm bulursak gerçekten takdir ediyorum. Bazı sızıntı verileri nedeniyle uygulama çökmesine kıyasla perticular View için ARC'yi kapattığımda. Lütfen
öner

4
Özel bir API kullanmak ASLA çözüm değildir.
Javier Soto

1

Bu, ios 6.0'da oryantasyon desteği için kullanıyorum

-(BOOL)shouldAutorotate{
    return YES;
}  

 - (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskAll;
}


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{  
  return UIInterfaceOrientationPortrait;
}

1

Bunun çok izlenen bir konu olması. En kolay cevap olduğuna inandığım şeyi ekleyeceğimi düşündüm. Bu, ios8 ve sonraki sürümler için çalışır

-(BOOL)shouldAutorotate
{
    return YES;
}

ve

-(UIInterfaceOrientationMask)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}

Bu kadar. Zevk almak!

Oh, ve ViewControllers'ım herhangi bir şekilde alt sınıfa ayırmam veya yapılandırmam gerekmeyen bir gezinme denetleyicisine gömülü.


0

Bu herkes için işe yaramayabilir ama benim için harika çalışıyor. Uygulamak yerine ...

[(MainNavigationController*)[self navigationController] setLandscapeOK:YES];

in viewWillAppear tüm denetleyicilerimde, bu işlemi UINavigationControllerDelegate yöntemini geçersiz kılarak UINavigationController alt sınıfımın içinde merkezileştirmeye karar verdimnavigationController:willShowViewController:animated:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

    self.previousVCLandscapeOK = self.isLandscapeOK; // Store the current VC's orientation preference before pushing on the new VC so we can set this again from within the custom "back" method
    self.isLandscapeOK = NO; // Set NO as default for all VC's
    if ([viewController isKindOfClass:[YourViewController class]]) {
        self.isLandscapeOK = YES;
    }
}

Bu temsilci yönteminin, gezinti yığınından bir VC çıkarırken çağrılmadığını buldum. Bu benim için bir sorun değildi çünkü geri işlevselliği UINavigationController alt sınıfımdan kullanıyorum, böylece uygun gezinme çubuğu düğmelerini ve belirli VC'ler için bunun gibi eylemleri ayarlayabiliyorum ...

if ([viewController isKindOfClass:[ShareViewController class]]) {

    UIButton* backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 57, 30)];
    [backButton setImage:[UIImage imageNamed:@"back-arrow"] forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem* backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    viewController.navigationItem.leftBarButtonItem = backButtonItem;

    UIImageView* shareTitle = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"share-title"]];
    [shareTitle setContentMode:UIViewContentModeScaleAspectFit];
    [shareTitle setFrame:CGRectMake(0, 0, shareTitle.frame.size.width - 10, shareTitle.frame.size.height - 10)];
    viewController.navigationItem.titleView = shareTitle;

} else if(...) {
    ...
}

İşte benim backyöntemim, VC'yi yığından çıkarmak ve uygun döndürme tercihini ayarlamak için nasıl görünüyor ...

- (void)back {
    self.isLandscapeOK = self.previousVCLandscapeOK;
    self.previousVCLandscapeOK = NO;
    [self popViewControllerAnimated:YES];
}

Gördüğünüz gibi, temelde olan tek şey, önce bana iki özellik ayarlıyorum ...

@property (nonatomic) BOOL isLandscapeOK;
@property (nonatomic) BOOL previousVCLandscapeOK;

içinde navigationController:willShowViewController:animated: olan VC içinde desteklenen yönelimlerin neler olduğunu belirleyecektir. Bir VC'yi patlatırken, özel "geri" yöntemim çağrılıyor ve ardından isLandscapeOK'u önceki VCLandscapeOK değeri aracılığıyla depolanan şeye ayarlıyorum.

Dediğim gibi, bu herkes için işe yaramayabilir, ancak benim için harika çalışıyor ve her bir görünüm denetleyicilerime kod ekleme konusunda endişelenmeme gerek yok, hepsini UINavigationController alt sınıfında merkezileştirmeyi başardım.

Umarım bu bana yaptığı gibi birine yardımcı olur. Teşekkürler Jeremy.



0

Yalnızca iOS 6 uygulama portresini zorlamak istiyorsanız, aşağıdaki yöntemlerden bir UIViewController alt sınıfına ekleyebilirsiniz.

- (BOOL)shouldAutorotate {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        return YES;
    } else {
        return NO;
    }
}


- (NSUInteger)supportedInterfaceOrientations {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        return UIInterfaceOrientationMaskAll;
    } else {
        return UIInterfaceOrientationMaskPortrait;
    }
}

2
Sorun şu ki, bu görünüm kök görünüm olmadıkça (ki bu soruda yer almıyor), Autorotate çağrılmamalıdır.
Brian

hangi nedenle olursa olsun dönüş türü NSUInteger, doğru var türü olmasına rağmen bir uyarı verir. UIInterfaceOrientationMaskBunun yerine OKB kullanıyorsanız .
Chris J

Ayrıca, bu çözüm, UINavigationController alt sınıflamasına gerek kalmadan sahip olduğum modal görüntü denetleyicisi (kamera görüntüsü) için mükemmel çalıştı. Tahminimce modlar bağımsız olarak ele alınır. Orijinal soruyla ilgili değil, ancak tasarım açısından yararlı bilgiler.
Chris J

0

Biri hariç tüm VC'lerimin dikey yöne kilitlenmesini istedim. Bu benim için çalıştı.

  1. Plist dosyasındaki tüm yönler için destek ekleyin.
  2. Kök görünüm denetleyicisinde, pencerenin üstündeki görünüm denetleyicisinin türünü algılayın ve supportedInterfaceOrientations yönteminde uygun şekilde uygulamanın yönünü ayarlayın . Örneğin, uygulamamın yalnızca web görünümü yığının en üstündeyken dönmesine ihtiyacım vardı. İşte rootVC'ime eklediğim şey:

    -(NSUInteger)supportedInterfaceOrientations
    {
        UIViewController *topMostViewController = [[Utils getAppDelegate] appNavigationController].topViewController;
        if ([topMostViewController isKindOfClass:[SVWebViewController class]]) {
            return UIInterfaceOrientationMaskAllButUpsideDown;
        }
        return UIInterfaceOrientationMaskPortrait;
    }

Trunal, Bu birkaç aylık ama en üstte bulunan görüntü denetleyicisinin türünü nasıl tespit ettiğiniz hakkında biraz daha ayrıntı verebilir misiniz? Özellikle burada ne yapacağınızdan emin değilim [[Utils getAppDelegate] appNavigationController]. Utils sanırım sahip olduğunuz bir sınıf ama içinde yaptığınız şeyi kaybettim. Herhangi bir yardım harika olur!
Ben

0

@Micmdk yanıtı altında @Ram S sorusunu yanıtlamak için yeterli itibarım yok, bu yüzden notumu buraya ekleyeceğim.

Eğer kullandığınız zaman UITabBarController , değiştirmeyi deneyin self.viewControllers.lastObject için @ micmdk kodunda self.selectedViewController böyle:

- (BOOL)shouldAutorotate {
    return [self.selectedViewController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations {
    return [self.selectedViewController supportedInterfaceOrientations];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [self.selectedViewController preferredInterfaceOrientationForPresentation];
}

0

Uygulamanızın PLIST'inde tanımlananlardan farklı bir yönelimde sunulması gereken tüm View Controller sınıflarınızda shouldAutorotate () ve supportedInterfaceOrientations var'ı uygulayabilir ve geçersiz kılabilirsiniz.

Bununla birlikte, basit olmayan bir Kullanıcı Arayüzünde, onu düzinelerce sınıfa eklemek için bir sorunla karşılaşabilirsiniz ve hepsini, onu destekleyen birkaç ortak alt sınıf yapmak istemezsiniz (MyBaseTableViewController, MyBaseNavigationController ve MyBaseTabBarController).

Bu yöntemi / var'ı UIViewController üzerinde doğrudan geçersiz kılamayacağınız için, bunu UITableViewController, UINavigationController ve UITabBarController gibi tipik olarak temel sınıflarınız olan alt sınıflarında yapabilirsiniz.

Bu yüzden, birkaç uzantı uygulayabilir ve yine de MyPreciousViewController'ı bu Swift 4 kod parçacığı gibi diğerlerinin hepsinden farklı bir yönelimde gösterecek şekilde kurabilirsiniz:

extension UITableViewController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {

    if let last = self.navigationController?.childViewControllers.last,
        last != self {
            return last.supportedInterfaceOrientations
    } else {
        return [.portrait]
    }
    }
}

extension MyPreciousViewController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {

    return [.portrait,.landscape]
    }
}


extension UINavigationController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {

        return [.portrait]
    }
}


extension UITabBarController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {

        return [.portrait]
    }
}

0

Aynı tür sorunu çözdüm.

UINavigationControllerGörünüm kontrolörlerini kullanmak için kullanıyorsanız, aşağıdaki yöntemleri ayarlamanız gerekir.

extension UINavigationController{

    override open var shouldAutorotate: Bool {

        if topViewController != nil && (topViewController?.isKind(of: LogInViewController.self))!
        {
            return true
        }
        return false
    }

    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {

        if topViewController != nil && (topViewController?.isKind(of: LogInViewController.self))!
        {
            return .portrait
        }
        return .landscapeRight

    }
    override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {

        if topViewController != nil && (topViewController?.isKind(of: LogInViewController.self))!
        {
            return .portrait
        }
        return .landscapeRight
    }
}

Göstermek istediğiniz LoginViewControllerkullanım yerine UIViewController. Benim durumumda, ben göstermek istiyorum LoginViewControlleriçinde Portraitmodunda diğer ViewControllersiçinde landscapemod.


-1

Bu sorunu çözmek için lütfen aşağıdaki yöntemi kullanın

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

sadece istediğiniz oryantasyonu iade edin !!!


3
Bunu yazdığım gibi yaptım. Bu dönen benim görünümü denetleyicisi tutar, ama yok değil ben döndüğünüzde geri desteklenen tek yönde zorlamak.
Harald Bögeholz

Bu benim için çalışmıyor. Bunu görünüm denetleyicime dahil etsem bile, görünüm hala dönüyor. Ne oluyor?
şim

neden maxfiresolutions için olumsuz oy vermelisiniz? Benim için çalıştı ve @ Flo tarafından verilen aynı yöntem birçok olumlu oy alıyor.
ViruMax
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.