iOS 6: Bagaimana cara membatasi beberapa tampilan menjadi potret dan mengizinkan yang lain untuk memutar?

99

Saya memiliki aplikasi iPhone yang menggunakan UINavigationControlleruntuk menampilkan antarmuka lihat perincian: Pertama satu tampilan, lalu tampilan lainnya, hingga empat tingkat. Saya ingin tiga tampilan pertama dibatasi pada orientasi potret dan hanya tampilan terakhir yang diperbolehkan untuk memutar ke lanskap. Saat kembali dari tampilan keempat ke tampilan ketiga dan keempat dalam orientasi lanskap, saya ingin semuanya berputar kembali ke potret.

Di iOS 5 saya cukup menentukan shouldAutorotateToInterfaceOrientation:di setiap pengontrol tampilan saya untuk mengembalikan YA untuk orientasi yang diizinkan. Semuanya bekerja seperti yang dijelaskan di atas, termasuk kembali ke potret meskipun perangkat sedang dipegang dalam orientasi lanskap saat kembali dari pengontrol tampilan # 4 ke # 3.

Di iOS 6 semua pengontrol tampilan berputar ke lanskap, melanggar yang tidak dimaksudkan. Catatan rilis iOS 6 mengatakan

Tanggung jawab lebih besar berpindah ke aplikasi dan delegasi aplikasi. Sekarang, penampung iOS (seperti UINavigationController) tidak berkonsultasi dengan anaknya untuk menentukan apakah mereka harus melakukan rotasi otomatis. [...] Sistem meminta pengontrol tampilan layar penuh paling atas (biasanya pengontrol tampilan root) untuk orientasi antarmuka yang didukung setiap kali perangkat berputar atau setiap kali pengontrol tampilan disajikan dengan gaya presentasi modal layar penuh. Selain itu, orientasi yang didukung diambil hanya jika pengontrol tampilan ini mengembalikan YA dari shouldAutorotatemetodenya. [...] Sistem menentukan apakah suatu orientasi didukung dengan memotong nilai yang dikembalikan oleh metode aplikasi supportedInterfaceOrientationsForWindow:dengan nilai yang dikembalikan oleh supportedInterfaceOrientationsmetode pengontrol layar penuh paling atas.

Jadi saya membuat subclass UINavigationController, memberikan MainNavigationControllerproperti boolean saya landscapeOKdan menggunakan ini untuk mengembalikan orientasi yang diizinkan masuk supportedInterfaceOrientations. Kemudian di setiap viewWillAppear:metode pengontrol tampilan saya, saya memiliki garis seperti ini

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

untuk memberi tahu saya MainNavigationControllerperilaku yang diinginkan.

Inilah pertanyaannya: Jika saya sekarang menavigasi ke tampilan keempat saya dalam mode potret dan membalikkan telepon itu berputar ke lanskap. Sekarang saya menekan tombol kembali untuk kembali ke tampilan ketiga saya yang seharusnya hanya berfungsi potret. Tapi itu tidak berputar kembali. Bagaimana cara membuatnya melakukan itu?

Saya mencoba

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]

dalam viewWillAppearmetode pengontrol tampilan ketiga saya, tetapi tidak melakukan apa-apa. Apakah ini metode yang salah untuk menelepon atau mungkin tempat yang salah untuk menyebutnya atau haruskah saya menerapkan semuanya dengan cara yang sama sekali berbeda?

Harald Bögeholz
sumber

Jawaban:

95

Saya memiliki masalah yang sama dan menemukan solusi yang sesuai untuk saya. Untuk membuatnya berfungsi, penerapan di UINavigationController Anda tidak cukup - (NSUInteger)supportedInterfaceOrientations. Anda juga perlu menerapkan metode ini di pengontrol # 3 Anda, yang merupakan yang pertama menjadi hanya potret setelah pengontrol popping # 4. Jadi, saya memiliki kode berikut di UINavigationController saya:

- (BOOL)shouldAutorotate
{
    return YES;
}

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

Dalam pengontrol tampilan # 3, tambahkan yang berikut ini:

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

Anda tidak perlu menambahkan apa pun ke pengontrol tampilan # 1, # 2, dan # 4 Anda. Ini berhasil untuk saya, saya harap ini akan membantu Anda.

Flo
sumber
8
Anda memecahkan sesuatu yang orang coba pecahkan selama berbulan-bulan! Anda berhak mendapatkan banyak pujian untuk ini! Saya menambahkan SupportInterfaceOrientations ke kategori di UIViewController dan berfungsi sempurna sebagai default untuk pengontrol hanya potret tersebut.
buruk
3
Di antara 100 jawaban berbeda di SO, inilah yang benar-benar berfungsi. Terima kasih :-)
Christer Nordvik
16
Saya memiliki pengaturan ini dan masih mendapatkan orientasi yang salah saat KEMBALI dari potret ke pengontrol tampilan yang dibatasi hanya untuk lanskap. Itu tidak berputar otomatis ke lanskap - Adakah yang masih melihatnya?
Oded Ben Dov
1
bagaimana jika pengontrol tampilan lanskap yang diinginkan disajikan dari segue dan tidak ada pengontrol navigasi?
jesses.co.tt
1
Edit yang terakhir menjadi NSUInteger sebagai tipe pengembalian.
abses
68

Tambahkan CustomNavigationController

Ganti metode ini di dalamnya:

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

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

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

Sekarang tambahkan semua orientasi di plist

masukkan deskripsi gambar di sini

Dalam pengontrol tampilan, tambahkan hanya yang diperlukan:

-(BOOL)shouldAutorotate
{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

metode ini menggantikan metode pengontrol navigasi

Zaraki
sumber
5
Anda benar-benar berhasil dengan jawaban ini! Terima kasih banyak. Anda benar-benar banyak membantu. Ini telah menjadi masalah besar bagi saya untuk sementara waktu. Kerja bagus.
K2Digital
Terima kasih! Ini membutuhkan begitu banyak waktu dan energi untuk saya pikirkan!
bkbeachlabs
Anda adalah penyelamat .... Ini berfungsi di aplikasi saya juga. Sebenarnya yang saya inginkan di aplikasi saya adalah semua ViewControllerdalam mode Potret dan yang saya ViewControllerdalam mode Landscap & Potret. Saya juga memberikan dukungan di iOS 5.0 & iOS 6.0. Itu sebabnya saya bingung untuk bekerja, tetapi ini adalah solusi yang bagus. saya menambahkan CustomNavigationController di pengontrol tampilan root saya dan memberikan dukungan sesuai dengan kebutuhan saya. Sekali lagi terima kasih.
Bhavin_m
Fantastis. Persis yang saya butuhkan. Terima kasih.
mszaro
bagaimana jika pengontrol tampilan lanskap yang diinginkan disajikan dari segue dan tidak ada pengontrol navigasi?
jesses.co.tt
9

Setelah melihat setiap jawaban dalam pertanyaan serupa yang tak terhitung jumlahnya di SO, tidak ada jawaban yang berhasil untuk saya, tetapi mereka memberi saya beberapa ide. Begini cara saya menyelesaikan masalah:

Pertama, pastikan Orientasi Antarmuka yang Didukung di target proyek Anda berisi semua orientasi yang Anda inginkan untuk tampilan berputar Anda.

masukkan deskripsi gambar di sini

Selanjutnya, buat kategori UINavigationController(karena Apple mengatakan untuk tidak membuat subkelasnya):

@implementation UINavigationController (iOS6AutorotationFix)

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

@end

Impor kategori itu dan pengontrol tampilan yang ingin Anda putar (yang akan saya panggil RotatingViewController) ke pengontrol tampilan tingkat tertinggi Anda, yang seharusnya berisi pengontrol navigasi Anda. Dalam pengontrol tampilan tersebut, implementasikan shouldAutorotatesebagai berikut. Perhatikan bahwa ini tidak boleh sama dengan pengontrol tampilan yang ingin Anda putar.

-(BOOL)shouldAutorotate {

    BOOL shouldRotate = NO;

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

    return shouldRotate;
}

Terakhir, di Anda RotatingViewController, terapkan shouldAutorotatedan supportedInterfaceOrientationssebagai berikut:

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

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

Alasan Anda perlu melakukan ini adalah karena iOS 6 memberikan kontrol rotasi ke pengontrol tampilan root, bukan pengontrol tampilan atas. Jika Anda ingin rotasi tampilan individu berperilaku berbeda dari tampilan lain dalam tumpukan, Anda perlu menulis kasus khusus untuk itu di pengontrol tampilan root.

Brian
sumber
2
Ini adalah jawaban luar biasa yang membutuhkan lebih banyak cinta. Berikut adalah potongan informasi di dalamnya yang tidak dapat saya temukan di tempat lain, dan yang sangat penting: Jika Anda ingin rotasi tampilan individu berperilaku berbeda dari tampilan lain di tumpukan, Anda perlu menulis kasus khusus untuk itu di root lihat pengontrol
shmim
Saya kira ini akan berfungsi jika Anda memiliki navigationController sebagai anggota pertama storyboard aplikasi Anda sebagai pengontrol awal, tetapi bagaimana dengan kasus ketika pengontrol awal hanyalah ViewController?
Bebek
4

Reputasi saya tidak cukup untuk mengomentari jawaban @ Brian, jadi saya akan menambahkan catatan saya di sini.

Brian menyebutkan bahwa iOS6 memberikan kontrol rotasi ke rootViewController - ini tidak hanya dapat berupa UINavigationController seperti yang disebutkan tetapi juga UITabBarController, yang cocok untuk saya. Struktur saya terlihat seperti ini:

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

Jadi saya menambahkan metode pertama di UITabBarController kustom, kemudian di UINavigationController kustom dan terakhir di UIViewController tertentu.

Contoh dari UITabBarController dan UINavigationController:

- (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];
}
micmdk
sumber
Saya benar-benar menggunakan UITabBarController sebagai variabel contoh di pengontrol tampilan root saya karena Anda tidak seharusnya membuat subkelas UITabBarController di versi iOS sebelum 6.0 dan saya perlu mendukung kembali ke iOS 5.0.
Brian
@micmdk Saya memiliki masalah yang sama. tolong beri tahu cara mengatasinya, saya telah menyalin kode Anda dan memasukkannya ke Pengontrol Navigasi kustom dan customUabbarController dan mengatur pengontrol tampilan lain sebagai Brian's Guided. tetapi masih belum mendapatkan pengontrol tampilan tetap dalam potret.
Ram S
@ Brian Saya punya masalah yang sama. mohon saran bagaimana mengatasinya, saya telah menyalin kode Anda dan memasukkannya ke dalam Pengontrol Navigasi kustom dan customUabbarController dan mengatur pengontrol tampilan lain sebagai Dipandu Micmdk. tetapi masih belum mendapatkan pengontrol tampilan tetap dalam potret di ios8.
Ram S
3

Saya ingin memberikan jawaban parsial untuk pertanyaan saya sendiri. Saya menemukan baris kode berikut, yang digunakan dalam viewWillAppearmetode ketiga saya UIViewController, berfungsi:

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

Tetapi saya tidak terlalu menyukai solusi ini. Ini menggunakan trik untuk menetapkan ke properti hanya-baca yang menurut dokumentasi Apple mewakili orientasi fisik perangkat. Ini seperti memberi tahu iPhone untuk melompat ke orientasi yang benar di tangan pengguna.

Saya sangat tergoda untuk meninggalkan ini di aplikasi saya karena ini berfungsi. Tetapi rasanya tidak benar, jadi saya ingin membiarkan pertanyaan itu terbuka untuk mendapatkan solusi yang bersih.

Harald Bögeholz
sumber
4
Aplikasi Anda kemungkinan besar akan ditolak jika Anda membiarkannya di sana. Saya mencari solusi untuk ini juga, tetapi sepertinya itu tidak mungkin. Yang bisa saya temukan hanyalah jawaban untuk pertanyaan ini: stackoverflow.com/questions/7196300/… itu semacam berfungsi tetapi untuk beberapa alasan itu merusak penanganan sentuhan tombol di salah satu viewcontrollers saya
Lope
Saya telah mengambil risiko saya dan mengirimkannya ke Apple. Masih menunggu tinjauan ... Saya akan mengabari Anda.
Harald Bögeholz
Apple baru saja menyetujui aplikasi saya dengan peretasan ini, yey! Saya harap itu tidak akan menjadi bumerang bagi saya di pembaruan iOS di masa mendatang. Sementara itu saya masih terbuka untuk saran solusi bersih!
Harald Bögeholz
1
@HaraldolGrt sugianto. tetapi ketika im bekerja di xcode baru dengan ARC daripada saya tidak dapat menggunakan ans. saya mendapatkan "Cast NSInteger (alias int) ke id tidak diizinkan dengan ARC PerformSelector dapat menyebabkan kebocoran karena pemilihnya tidak diketahui" bagaimana saya bisa menyelesaikannya? Saya sangat menghargai Anda jika kami mendapat solusi. Ketika saya menonaktifkan ARC untuk Tampilan perticular daripada crash aplikasi karena beberapa data kebocoran. Tolong sarankan saya
Hitarth
4
Menggunakan API pribadi TIDAK PERNAH menjadi solusinya.
Javier Soto
2

Ini saya gunakan untuk dukungan orientasi di ios 6.0

-(BOOL)shouldAutorotate{
    return YES;
}  

 - (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskAll;
}


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{  
  return UIInterfaceOrientationPortrait;
}
ASHISHT
sumber
1

Karena ini adalah utas yang sangat dilihat. Saya pikir saya akan menambahkan apa yang saya yakini sebagai jawaban termudah. Ini berfungsi untuk ios8 dan yang lebih baru

-(BOOL)shouldAutorotate
{
    return YES;
}

dan

-(UIInterfaceOrientationMask)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}

Itu dia. Nikmati!

Oh, dan ViewControllers saya tertanam dalam pengontrol navigasi, yang tidak perlu saya subkelas atau konfigurasikan dengan cara apa pun.

Reeder 32
sumber
0

Ini mungkin tidak berhasil untuk semua orang, tetapi berhasil dengan baik untuk saya. Alih-alih menerapkan ...

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

di viewWillAppear di semua pengontrol saya, saya memutuskan untuk memusatkan proses ini di dalam subkelas UINavigationController saya dengan mengganti metode UINavigationControllerDelegatenavigationController: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;
    }
}

Saya telah menemukan bahwa metode delegasi ini tidak dipanggil ketika mengeluarkan VC dari tumpukan navigasi. Ini bukan masalah bagi saya karena saya menangani fungsionalitas belakang dari dalam subkelas UINavigationController saya sehingga saya dapat mengatur tombol dan tindakan bilah navigasi yang tepat untuk VC tertentu seperti ini ...

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(...) {
    ...
}

Berikut adalah bagaimana backmetode saya terlihat untuk menangani popping VC dari tumpukan dan untuk mengatur preferensi rotasi yang sesuai ...

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

Jadi, seperti yang Anda lihat, pada dasarnya yang terjadi adalah pertama-tama saya menetapkan dua properti untuk saya ...

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

di navigationController:willShowViewController:animated:mana akan menentukan apa orientasi didukung berada dalam yang VC yang hendak disajikan. Saat memunculkan VC, metode "kembali" kustom saya dipanggil dan saya kemudian menyetel isLandscapeOK ke apa yang disimpan melalui nilai VCLandscapeOK sebelumnya.

Seperti yang saya katakan, ini mungkin tidak berfungsi untuk semua orang, tetapi berfungsi dengan baik untuk saya dan saya tidak perlu khawatir tentang menambahkan kode ke setiap pengontrol tampilan saya, saya dapat menjaga semuanya terpusat di subkelas UINavigationController.

Semoga ini membantu seseorang seperti yang saya lakukan. Terima kasih, Jeremy.

Jeremy Fox
sumber
0

Buka file Info.plist Anda dan lakukan perubahanmasukkan deskripsi gambar di sini

Nekelle Latoya Celestine
sumber
0

Anda ingin Memaksa potret aplikasi iOS 6 saja, lalu Anda dapat menambahkan metode subkelas UIViewController di bawah ini

- (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;
    }
}
Vaibhav Saran
sumber
2
Masalahnya adalah kecuali tampilan tersebut adalah tampilan root (yang tidak ada dalam pertanyaan ini), shouldAutorotate tidak dipanggil.
Brian
untuk alasan apa pun, tipe kembalian NSUIntegerakan menampilkan peringatan meskipun itu adalah tipe var yang benar. jika Anda memiliki penggunaan OCD UIInterfaceOrientationMasksebagai gantinya.
Chris J
Juga, solusi ini bekerja dengan sempurna untuk pengontrol tampilan modal (tampilan kamera) yang saya miliki tanpa perlu subclassing UINavigationController. Saya menduga modal diperlakukan secara independen. Tidak relevan dengan pertanyaan awal, tetapi info berguna untuk memiliki desain yang bijaksana.
Chris J
0

Saya ingin semua VC saya terkunci pada orientasi potret kecuali satu. Inilah yang berhasil bagi saya.

  1. Tambahkan dukungan untuk semua orientasi di file plist.
  2. Di root controller tampilan, mendeteksi jenis thats controller tampilan di atas jendela dan mengatur orientasi aplikasi yang sesuai di supportedInterfaceOrientations metode. Misalnya, saya membutuhkan aplikasi saya untuk berputar hanya ketika tampilan web berada di atas tumpukan. Inilah yang saya tambahkan di rootVC saya:

    -(NSUInteger)supportedInterfaceOrientations
    {
        UIViewController *topMostViewController = [[Utils getAppDelegate] appNavigationController].topViewController;
        if ([topMostViewController isKindOfClass:[SVWebViewController class]]) {
            return UIInterfaceOrientationMaskAllButUpsideDown;
        }
        return UIInterfaceOrientationMaskPortrait;
    }
Trunal Bhanse
sumber
Trunal, Ini berumur beberapa bulan tetapi dapatkah Anda memberikan sedikit lebih banyak detail tentang bagaimana Anda mendeteksi jenis pengontrol tampilan yang ada di atas. Secara khusus saya tidak yakin apa yang Anda lakukan di sini [[Utils getAppDelegate] appNavigationController]. Utilitas Saya menduga adalah beberapa kelas yang Anda miliki tetapi saya bingung apa yang Anda lakukan di dalamnya. Bantuan apa pun akan sangat bagus!
Ben
0

Reputasi saya tidak cukup untuk menjawab pertanyaan @Ram S di bawah balasan @micmdk, jadi saya akan menambahkan catatan saya di sini.

Saat Anda menggunakan UITabbarController , coba ubah self.viewControllers.lastObject dalam kode @ micmdk menjadi self.selectedViewController seperti ini:

- (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];
}
phantom_2
sumber
0

Anda bisa mengimplementasikan dan mengganti shouldAutorotate () dan supportInterfaceOrientations var di semua kelas View Controller Anda yang harus disajikan dalam orientasi berbeda dari yang ditentukan dalam PLIST aplikasi Anda.

Namun, dalam Antarmuka Pengguna nontrivial Anda mungkin menghadapi masalah untuk menambahkannya dalam lusinan kelas dan Anda tidak ingin membuat semuanya menjadi subkelas dari beberapa umum yang mendukungnya (MyBaseTableViewController, MyBaseNavigationController dan MyBaseTabBarController).

Karena Anda tidak dapat mengganti metode / var tersebut di UIViewController secara langsung, Anda dapat melakukannya pada subkelasnya yang biasanya merupakan kelas dasar Anda seperti UITableViewController, UINavigationController, dan UITabBarController.

Jadi, Anda dapat menerapkan beberapa ekstensi dan tetap menyiapkan MyPreciousViewController untuk ditampilkan dalam orientasi yang berbeda dari yang lain seperti cuplikan kode Swift 4 ini:

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]
    }
}
vedrano
sumber
0

Saya telah memecahkan masalah yang sama.

Jika Anda menggunakan UINavigationControlleruntuk mendorong pengontrol tampilan, Anda harus menyetel metode di bawah ini.

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

Di tempat LoginViewControllerpenggunaan yang UIViewControlleringin Anda tunjukkan. Dalam kasus saya, saya ingin menunjukkan LoginViewControllerdalam Portraitmode lainnya ViewControllersdalam landscapemode.

Ramakrishna
sumber
-1

Silakan gunakan metode berikut untuk menyelesaikan masalah ini

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

kembalikan hanya orientasi yang Anda inginkan !!!

maxfiresolutions
sumber
3
Saya melakukan itu, seperti yang saya tulis. Hal ini membuat pengontrol tampilan saya tidak berputar, tetapi tidak memaksanya kembali ke satu-satunya orientasi yang didukung saat saya kembali ke sana.
Harald Bögeholz
Ini tidak berhasil untuk saya. Bahkan setelah memasukkan ini ke dalam pengontrol tampilan saya, tampilan masih berputar. Apa yang memberi?
shim
mengapa downvote untuk maxfiresolutions? Itu berhasil untuk saya dan metode yang sama yang diberikan oleh @Flo memiliki banyak suara positif.
ViruMax