Apakah ada cara terdokumentasi untuk mengatur orientasi iPhone?

94

Saya memiliki aplikasi di mana saya ingin mendukung rotasi perangkat dalam tampilan tertentu tetapi yang lain tidak terlalu masuk akal dalam mode Lansekap, jadi saat saya menukar tampilan, saya ingin memaksa rotasi diatur ke potret.

Ada penyetel properti tidak berdokumen di UIDevice yang melakukan trik tersebut tetapi jelas menghasilkan peringatan compiler dan bisa menghilang dengan revisi SDK di masa mendatang.

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];

Apakah ada cara terdokumentasi untuk memaksa orientasi?

Pembaruan: Saya pikir saya akan memberikan contoh karena saya tidak mencari shouldAutorotateToInterfaceOrientation karena saya telah menerapkannya.

Saya ingin aplikasi saya mendukung lanskap dan potret di Tampilan 1 tetapi hanya potret di Tampilan 2. Saya telah mengimplementasikan shouldAutorotateToInterfaceOrientation untuk semua tampilan tetapi jika pengguna dalam mode lanskap di Tampilan 1 dan kemudian beralih ke Tampilan 2, saya ingin memaksa telepon untuk memutar kembali ke Potret.

Dave Verwer
sumber
11
Saya telah mengajukan bug pada ini, menyarankan Apple untuk mengekspos API di atas, atau menghormati YA, TIDAK dikembalikan dari metode shouldRotate, ketika tampilan pertama kali dimuat, tidak hanya ketika telepon berputar.
rustyshelf
2
Saya telah mengajukan bug yang meminta setOrientation diekspos
Jessedc
1
[[UIDevice currentDevice] setOrientation: UIInterfaceOrientationPortrait]; Metode ini sudah usang dan tidak ada lagi.
Hikmat Khan

Jawaban:

6

Ini tidak lagi menjadi masalah di iPhone 3.1.2 SDK yang lebih baru. Sekarang tampaknya menghormati orientasi yang diminta dari tampilan yang didorong kembali ke tumpukan. Itu mungkin berarti bahwa Anda perlu mendeteksi versi iPhone OS yang lebih lama dan hanya menerapkan setOrientation saat sebelum rilis terbaru.

Tidak jelas apakah analisis statis Apple akan memahami bahwa Anda sedang mengatasi batasan SDK yang lebih lama. Saya pribadi telah diberitahu oleh Apple untuk menghapus panggilan metode pada pembaruan saya berikutnya jadi saya belum yakin apakah peretasan untuk perangkat yang lebih lama akan melalui proses persetujuan.

John K
sumber
Ini bukan kasus iPhone Simulator 3.3.2. Itu masih belum berhasil.
Bebek
4
@user Bagaimana Anda meminta orientasi saat mendorong tampilan di tumpukan?
progrmr
4
Anda bisa menghindari analisis statis Apple. Saya berhasil menggunakan kode tidak berdokumen dengan menggunakan performSelector dan mengandalkan dinamisme Obj-C yang mengagumkan.
Kenneth Ballenegger
@KennethBallenegger Saya ingat pernah membaca dalam pedoman dan / atau perjanjian bahwa menyembunyikan hal-hal seperti itu dapat membuat aplikasi Anda dihapus dan bahkan mungkin akun Anda dihapus. Saya tidak akan mengambil risiko itu hanya dengan menggunakan API yang tidak berdokumen.
Ivan Vučica
101

Ini lama setelah fakta, tetapi untuk berjaga-jaga jika ada orang yang tidak menggunakan pengontrol navigasi dan / atau tidak ingin menggunakan metode yang tidak terdokumentasi:

UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
[c release];

Ini cukup untuk menampilkan dan menutup pengontrol tampilan vanilla.

Jelas Anda masih perlu mengonfirmasi atau menolak orientasi dalam penggantian shouldAutorotateToInterfaceOrientation Anda. Tapi ini akan menyebabkan shouldAutorotate ... dipanggil lagi oleh sistem.

Josh
sumber
1
Luar biasa, yang ini tidak ditandai sebagai jawaban yang benar dari posting ini, tetapi ini menyelesaikan setengah dari masalah saya stackoverflow.com/questions/5030315 . Trik tampilan model 'memaksa' orientasi potret, apakah Anda juga tahu cara memaksa lanskap?
epologee
5
Hah hah!! ini terlalu bodoh! TAPI BEKERJA! - tentu saja! : D
hfossli
Luar biasa, sudah lama bergumul dengan ini. Terima kasih! pasangan
Rahul Choudhary
3
Tampaknya ini berfungsi baik untuk iOS5 dan iOS6: [self presentViewController: [UIViewController new] animated: NO penyelesaian: ^ {[self dischargeViewControllerAnimated: NO penyelesaian: nil]; }];
Inferis
1
Ini tampaknya berfungsi di iOS 7 dan iOS 8, tetapi ada layar hitam yang terlihat berkedip-kedip (terutama iOS 8).
levigroker
16

Jika Anda ingin memaksanya untuk memutar dari potret ke lanskap di sini adalah kodenya. Perhatikan saja bahwa Anda perlu menyesuaikan bagian tengah tampilan Anda. Saya perhatikan saya tidak menempatkan pemandangan di tempat yang tepat. Jika tidak, itu bekerja dengan sempurna. Terima kasih atas tipnya.

if(UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){

        [UIView beginAnimations:@"View Flip" context:nil];
        [UIView setAnimationDuration:0.5f];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
        self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
        self.view.center = CGPointMake(160.0f, 240.0f);

        [UIView commitAnimations];
}
Michael Gaylord
sumber
Apakah ini juga akan berfungsi jika saya menambahkan UIAlertView? Saya mencoba CGAffineTransformMakeRotationtampilan bisa diputar tetapi UIAlertView masih sesuai dengan orientasi bilah status yaitu, -degreeToRadian (sudut)? Apakah Anda mendapatkan sesuatu seperti ini?
NeverHopeless
Cara termudah untuk melakukan ini dengan a UIAlertViewadalah dengan menyetel pengontrol tampilan Anda sebagai delegasi alertView lalu di:, - (void) didPresentAlertView:(UIAlertView *) alertViewAnda melakukan rotasi berdasarkan arus [UIApplication sharedApplication].statusBarOrientation. Jika Anda tidak menganimasikannya, seharusnya tidak terlihat terlalu aneh.
Michael Gaylord
16

Dari apa yang saya tahu, file setOrientation: metode ini tidak berfungsi (atau mungkin tidak berfungsi lagi). Inilah yang saya lakukan untuk melakukan ini:

pertama, letakkan definisi ini di bagian atas file Anda, tepat di bawah #imports Anda:

#define degreesToRadian(x) (M_PI * (x) / 180.0)

kemudian, dalam viewWillAppear:metode

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];     
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) {  
    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
    self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}

jika Anda ingin itu menjadi animasi, maka Anda dapat membungkus semuanya dalam blok animasi, seperti:

[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:1.25];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];     
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) {  
    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
    self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}
[UIView commitAnimations];

Kemudian, di pengontrol mode potret Anda, Anda dapat melakukan pembalikan - periksa untuk melihat apakah saat ini dalam lanskap, dan jika demikian, putar kembali ke Potret.

Bdebeez
sumber
1
Daripada self.view Anda harus memutar self.window.view. Ini berguna jika Anda memiliki UITabBar atau pengontrol lain di atas tampilan Anda.
Borut Tomazin
7

Saya mengalami masalah di mana saya memiliki UIViewControllerlayar, dalam UINavigationController, dalam orientasi lanskap. Namun, ketika pengontrol tampilan berikutnya didorong ke dalam aliran, saya memerlukan perangkat untuk kembali ke orientasi potret.

Apa yang saya perhatikan, adalah bahwa shouldAutorotateToInterfaceOrientation:metode ini tidak dipanggil ketika pengontrol tampilan baru didorong ke tumpukan, tetapi dipanggil ketika pengontrol tampilan muncul dari tumpukan .

Memanfaatkan ini, saya menggunakan cuplikan kode ini di salah satu aplikasi saya:

- (void)selectHostingAtIndex:(int)hostingIndex {

    self.transitioning = YES;

    UIViewController *garbageController = [[[UIViewController alloc] init] autorelease];
    [self.navigationController pushViewController:garbageController animated:NO];
    [self.navigationController popViewControllerAnimated:NO];

    BBHostingController *hostingController = [[BBHostingController alloc] init];
    hostingController.hosting = [self.hostings objectAtIndex:hostingIndex];
    [self.navigationController pushViewController:hostingController animated:YES];
    [hostingController release];

    self.transitioning = NO;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    if (self.transitioning)
        return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
    else
        return YES;
}

Pada dasarnya, dengan membuat pengontrol tampilan kosong, mendorongnya ke tumpukan, dan segera mengeluarkannya, dimungkinkan untuk membuat antarmuka kembali ke posisi potret. Setelah pengontrol dimunculkan, saya hanya mendorong pengontrol yang ingin saya dorong terlebih dahulu. Secara visual, ini tampak hebat - pengontrol tampilan yang kosong dan sewenang-wenang tidak pernah dilihat oleh pengguna.

Andrew Vilcsak
sumber
Hai, saya baru saja menerapkan metode Anda untuk memaksa VC dalam orientasi yang benar sebelum mendorongnya, tetapi saya telah menemukan bahwa itu hanya berfungsi saat memaksa orientasi Potret (jika tampilan saat ini adalah Potret dan Anda ingin memaksa berikutnya ke lanskap, itu menang panggil shouldAutorotateToInterfaceOrientation: saat muncul). Apakah Anda sudah menemukan solusi untuk memaksa tampilan ke Landscape?
Rafael Nobre
Menarik - Saya tidak mengalami masalah ini, maaf. Saya akan mencoba bermain-main dengan urutan push dan pops, ada kemungkinan besar Anda akan menemukan sesuatu.
Andrew Vilcsak
7

Ada cara sederhana untuk memaksa iPhone secara terprogram ke orientasi yang diperlukan - menggunakan dua jawaban yang sudah disediakan oleh kdbdallas , Josh :

//will rotate status bar
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];


//will re-rotate view according to statusbar
UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
[c release];

bekerja seperti pesona :)

EDIT:

untuk iOS 6 saya perlu menambahkan fungsi ini: (bekerja pada modal viewcontroller)

- (NSUInteger)supportedInterfaceOrientations
{
    return (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight);
}
Guntis Treulands
sumber
Bagi saya itu tidak bekerja seperti pesona: Bilah navigasi dan bilah alat menyusut, ke ketinggian yang mereka miliki dalam tampilan Lansekap. Metode dengan menghapus dan menambahkan kembali tampilan paling atas menjaga ketinggian yang benar, tetapi memiliki kerugian juga: Bilah navigasi saya bergerak sedikit ke bawah (seperti jika bilah pengukur diaktifkan)
AlexWien
Ia bekerja di pihak saya, baik pada modal dan viewcontroller yang didorong. Tetapi hanya di iOS 5. :(
Guntis Treulands
Ya, saya mendapatkannya untuk bekerja di iOS5 juga. Sekarang di ios6 ketinggian bilah navigasi menyusut setelah pengontrol tampilan lanskap modal ditutup
AlexWien
7

Saya telah menggali dan menggali mencari solusi yang baik untuk ini. Menemukan entri blog ini yang melakukan trik: hapus tampilan terluar Anda dari kunci UIWindowdan tambahkan lagi, sistem kemudian akan melakukan kueri ulang shouldAutorotateToInterfaceOrientation:metode dari pengontrol tampilan Anda, memaksakan orientasi yang benar untuk diterapkan. Lihat: iphone memaksa UI untuk mengubah orientasi

Rafael Nobre
sumber
Solusi ini bekerja paling baik untuk saya. Yang penting, perbaikan yang menampilkan modalViewController kosong menyebabkan animasi yang salah saat mendorong viewcontrollers ke dalam stack. Metode UIWindow ini tidak mengalami masalah yang sama.
Rik Smith-Unna
5

Jawaban Josh bekerja dengan baik untukku.

Namun, saya lebih suka memposting pemberitahuan "orientasi memang berubah, perbarui UI" . Saat notifikasi ini diterima oleh pengontrol tampilan, ia memanggil shouldAutorotateToInterfaceOrientation:, memungkinkan Anda menyetel orientasi apa pun dengan kembali YESke orientasi yang Anda inginkan.

[[NSNotificationCenter defaultCenter] postNotificationName:UIDeviceOrientationDidChangeNotification object:nil];

Satu-satunya masalah adalah ini memaksa orientasi ulang tanpa animasi. Anda perlu membungkus garis ini antara beginAnimations:dancommitAnimations untuk mencapai transisi yang mulus.

Semoga membantu.

Christian Schnorr
sumber
3

FWIW, inilah implementasi saya untuk mengatur orientasi secara manual (untuk masuk ke pengontrol tampilan root aplikasi Anda, natch):

-(void)rotateInterfaceToOrientation:(UIDeviceOrientation)orientation{

    CGRect bounds = [[ UIScreen mainScreen ] bounds ];
    CGAffineTransform t;
    CGFloat r = 0;
    switch ( orientation ) {
        case UIDeviceOrientationLandscapeRight:
            r = -(M_PI / 2);
            break;
        case UIDeviceOrientationLandscapeLeft:
            r  = M_PI / 2;
            break;
    }
    if( r != 0 ){
        CGSize sz = bounds.size;
        bounds.size.width = sz.height;
        bounds.size.height = sz.width;
    }
    t = CGAffineTransformMakeRotation( r );

    UIApplication *application = [ UIApplication sharedApplication ];

    [ UIView beginAnimations:@"InterfaceOrientation" context: nil ];
    [ UIView setAnimationDuration: [ application statusBarOrientationAnimationDuration ] ];
    self.view.transform = t;
    self.view.bounds = bounds;
    [ UIView commitAnimations ];

    [ application setStatusBarOrientation: orientation animated: YES ];     
}

digabungkan dengan UINavigationControllerDelegatemetode berikut (dengan asumsi Anda menggunakan a UINavigationController):

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
    // rotate interface, if we need to
    UIDeviceOrientation orientation = [[ UIDevice currentDevice ] orientation ];
    BOOL bViewControllerDoesSupportCurrentOrientation = [ viewController shouldAutorotateToInterfaceOrientation: orientation ];
    if( !bViewControllerDoesSupportCurrentOrientation ){
        [ self rotateInterfaceToOrientation: UIDeviceOrientationPortrait ];
    }
}

Itu menangani pemutaran tampilan root sesuai dengan apakah yang masuk UIViewControllermendukung orientasi perangkat saat ini. Akhirnya, Anda ingin menghubungkan rotateInterfaceToOrientationke perubahan orientasi perangkat yang sebenarnya untuk meniru fungsionalitas iOS standar. Tambahkan event handler ini ke pengontrol tampilan root yang sama:

-(void)onUIDeviceOrientationDidChangeNotification:(NSNotification*)notification{
    UIViewController *tvc = self.rootNavigationController.topViewController;
    UIDeviceOrientation orientation = [[ UIDevice currentDevice ] orientation ];
    // only switch if we need to (seem to get multiple notifications on device)
    if( orientation != [[ UIApplication sharedApplication ] statusBarOrientation ] ){
        if( [ tvc shouldAutorotateToInterfaceOrientation: orientation ] ){
            [ self rotateInterfaceToOrientation: orientation ];
        }
    }
}

Terakhir, daftar untuk UIDeviceOrientationDidChangeNotificationnotifikasi di initatau loadviewseperti ini:

[[ NSNotificationCenter defaultCenter ] addObserver: self
                                           selector: @selector(onUIDeviceOrientationDidChangeNotification:)
                                               name: UIDeviceOrientationDidChangeNotification
                                             object: nil ];
[[ UIDevice currentDevice ] beginGeneratingDeviceOrientationNotifications ];
Henry Cooke
sumber
Ini adalah satu-satunya jawaban di halaman ini yang berhasil saya sesuaikan dengan kode pengontrol navigasi saya. Satu masalah kecil adalah bahwa bilah navigasi yang diputar tidak mengubah ketinggian antara orientasi potret dan lanskap seperti yang akan terjadi jika diputar melalui mekanisme normal.
Dan Dyer
@DanDyer sudahkah Anda memecahkan masalah dengan ketinggian bilah navigasi yang salah? (Terutama di ios6 tingginya salah)
AlexWien
@AlexWien Saya akhirnya berhasil meyakinkan klien bahwa kita tidak boleh melakukan ini. Untuk iOS 6 Anda mungkin perlu melakukan sesuatu dengan shouldAutorotatemetode baru (lihat stackoverflow.com/a/12586002/5171 ).
Dan Dyer
@DanDyer menyelesaikannya kemarin, menyembunyikan dan menampilkan navigasi dan statusBar sederhana di ViewDidAppear menyelesaikannya.Sekarang semua berfungsi (SDK ios6, target ios5) Saya harus menguji ulang dengan target ios6
AlexWien
2

Ini berhasil untuk saya (terima kasih Henry Cooke):

Tujuan saya adalah untuk menangani perubahan orientasi lanskap saja.

metode init:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(orientationChanged:)
                                             name:UIDeviceOrientationDidChangeNotification
                                           object:nil];

- (void)orientationChanged:(NSNotification *)notification {    
    //[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    CGRect bounds = [[ UIScreen mainScreen ] bounds ];
    CGAffineTransform t;
    CGFloat r = 0;
    switch ( orientation ) {
        case UIDeviceOrientationLandscapeRight:
            r = 0;
            NSLog(@"Right");
            break;
        case UIDeviceOrientationLandscapeLeft:
            r  = M_PI;
            NSLog(@"Left");
            break;
        default:return;
    }

    t = CGAffineTransformMakeRotation( r );

    UIApplication *application = [ UIApplication sharedApplication ];
    [ UIView beginAnimations:@"InterfaceOrientation" context: nil ];
    [ UIView setAnimationDuration: [ application statusBarOrientationAnimationDuration ] ];
    self.view.transform = t;
    self.view.bounds = bounds;
    [ UIView commitAnimations ];

    [ application setStatusBarOrientation: orientation animated: YES ];
}
pengguna324168
sumber
1

Saya memiliki aplikasi di mana saya ingin mendukung rotasi perangkat dalam tampilan tertentu tetapi yang lain tidak terlalu masuk akal dalam mode Lansekap, jadi saat saya menukar tampilan, saya ingin memaksa rotasi diatur ke potret.

Saya menyadari bahwa posting asli di atas di utas ini sudah sangat tua sekarang, tetapi saya memiliki masalah yang sama - yaitu. semua layar di Aplikasi saya hanya potret, dengan pengecualian satu layar, yang dapat diputar antara lanskap dan potret oleh pengguna.

Ini cukup mudah, tetapi seperti posting lainnya, saya ingin Aplikasi secara otomatis kembali ke potret terlepas dari orientasi perangkat saat ini, ketika kembali ke layar sebelumnya.

Solusi yang saya terapkan adalah menyembunyikan Bilah Navigasi saat dalam mode lanskap, yang berarti bahwa pengguna hanya dapat kembali ke layar sebelumnya saat dalam mode potret. Oleh karena itu, semua layar lainnya hanya dapat dalam mode potret.

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)pInterfaceOrientation {
    BOOL lHideNavBar = self.interfaceOrientation == UIInterfaceOrientationPortrait ? NO : YES;
    [self.navigationController setNavigationBarHidden:lHideNavBar animated:YES];
}

Ini juga memiliki manfaat tambahan untuk Aplikasi saya karena ada lebih banyak ruang layar yang tersedia dalam mode lanskap. Ini berguna karena layar yang dimaksud digunakan untuk menampilkan file PDF.

Semoga ini membantu.

stephencampbell
sumber
1

Saya menyelesaikan ini dengan cukup mudah pada akhirnya. Saya mencoba setiap saran di atas dan masih gagal, jadi inilah solusi saya:

Di ViewController yang perlu tetap Landscape (Kiri atau Kanan), saya mendengarkan perubahan orientasi:

    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didRotate:)
                                             name:UIDeviceOrientationDidChangeNotification object:nil];

Kemudian di didRotate:

- (void) didRotate:(NSNotification *)notification
{   if (orientationa == UIDeviceOrientationPortrait) 
    {
        if (hasRotated == NO) 
        {
            NSLog(@"Rotating to portait");
            hasRotated = YES;
            [UIView beginAnimations: @"" context:nil];
            [UIView setAnimationDuration: 0];
            self.view.transform = CGAffineTransformIdentity;
            self.view.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(-90));
            self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
            self.view.frame = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
            [UIView commitAnimations];

    }
}
else if (UIDeviceOrientationIsLandscape( orientationa))
{
    if (hasRotated) 
    {
        NSLog(@"Rotating to lands");
        hasRotated = NO;
        [UIView beginAnimations: @"" context:nil];
        [UIView setAnimationDuration: 0];
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(0));
        self.view.bounds = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
        self.view.frame = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
        [UIView commitAnimations];

    }
}

Ingatlah setiap Super Views / Subviews yang menggunakan autoresizing, karena view.bounds / frame sedang disetel ulang secara eksplisit ...

Satu-satunya peringatan untuk metode ini untuk mempertahankan tampilan Lansekap, adalah animasi yang melekat yang beralih di antara orientasi yang harus terjadi, ketika akan lebih baik untuk membuatnya tampak tidak ada perubahan.

David van Dugteren
sumber
1

Solusi iOS 6:

[[[self window] rootViewController] presentViewController:[[UIViewController alloc] init] animated:NO completion:^{
    [[[self window] rootViewController] dismissViewControllerAnimated:NO completion:nil];
}];

Kode tepatnya tergantung per aplikasi dan juga di mana Anda meletakkannya (saya menggunakannya di AppDelegate saya). Gantikan [[self window] rootViewController]dengan apa yang Anda gunakan. Saya menggunakan file UITabBarController.

Bo A
sumber
0

Saya menemukan solusi dan menulis sesuatu dalam bahasa Prancis (tetapi kode dalam bahasa Inggris). sini

Caranya adalah dengan menambahkan pengontrol ke tampilan jendela (pengontrol harus memiliki implementasi yang baik dari fungsi shouldRotate ....).

Vinzius
sumber
-3

Jika Anda menggunakan UIViewControllers, ada metode ini:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

Kembali NOuntuk pengontrol tampilan yang berisi tampilan yang tidak ingin Anda putar.

Info selengkapnya di sini

Martin Gordon
sumber
1
Itu menghentikan rotasi, yang saya cari adalah memaksa rotasi kembali ke potret jika pengguna dalam lanskap. Saya telah menambahkan contoh di atas untuk mengatakan apa yang saya maksud dengan lebih baik.
Dave Verwer
-3

Saya tidak berpikir ini mungkin dilakukan pada saat run-time, meskipun Anda tentu saja dapat menerapkan transformasi 90 derajat ke UI Anda.

Andrew Grant
sumber
Mungkin dengan kode yang saya posting semula, Anda tidak pernah tahu kapan itu mungkin berhenti berfungsi;)
Dave Verwer
-3

Ini yang saya gunakan. (Anda mendapatkan beberapa peringatan kompilasi tetapi berfungsi baik di Simulator dan iPhone)

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
kdbdallas.dll
sumber
Saya telah menemukan ini cukup untuk membuatnya berfungsi di 4.1 juga. Namun karena bilah status saya disetel ke tersembunyi, saya memperoleh celah 20 piksel di atas :(
Anthony Main
setOrientation adalah api pribadi dan aplikasi yang menggunakannya ditolak.
Sendirian