Có cách nào được ghi lại để đặt hướng iPhone không?


94

Tôi có một ứng dụng mà tôi muốn hỗ trợ xoay thiết bị ở một số chế độ xem nhất định nhưng các ứng dụng khác không có ý nghĩa đặc biệt ở chế độ Ngang, vì vậy khi tôi hoán đổi các chế độ xem, tôi muốn buộc xoay được đặt thành dọc.

Có một trình thiết lập thuộc tính không có giấy tờ trên UIDevice thực hiện thủ thuật này nhưng rõ ràng là tạo ra cảnh báo trình biên dịch và có thể biến mất khi có bản sửa đổi SDK trong tương lai.

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];

Có bất kỳ cách nào được ghi nhận để buộc định hướng không?

Cập nhật: Tôi nghĩ tôi sẽ cung cấp một ví dụ vì tôi không tìm nênAutorotateToInterfaceOrientation vì tôi đã triển khai điều đó.

Tôi muốn ứng dụng của mình hỗ trợ ngang và dọc trong Chế độ xem 1 nhưng chỉ dọc trong Chế độ xem 2. Tôi đã triển khai shouldAutorotateToInterfaceOrientation cho tất cả các chế độ xem nhưng nếu người dùng đang ở chế độ ngang trong Chế độ xem 1 và sau đó chuyển sang Chế độ xem 2, tôi muốn buộc để xoay trở lại Portrait.


11
Tôi đã gửi một lỗi về điều này, đề nghị Apple tiết lộ API ở trên hoặc tôn trọng CÓ, KHÔNG được trả về từ phương thức shouldRotate, khi một chế độ xem tải lần đầu tiên, không chỉ khi điện thoại xoay.
gỉ sắt

2
Tôi đã nộp một lỗi hỏi setOrientation đó được tiếp xúc
Jessedc

1
[[UIDevice currentDevice] setOrientation: UIInterfaceOrientationPortrait]; Phương pháp này không được dùng nữa và không tồn tại nữa.
Hikmat Khan

Câu trả lời:


6

Đây không còn là vấn đề trên iPhone 3.1.2 SDK sau này. Bây giờ nó dường như tôn trọng hướng được yêu cầu của chế độ xem được đẩy trở lại ngăn xếp. Điều đó có nghĩa là bạn sẽ cần phát hiện các phiên bản hệ điều hành iPhone cũ hơn và chỉ áp dụng setOrientation khi nó có trước bản phát hành mới nhất.

Không rõ liệu phân tích tĩnh của Apple có hiểu rằng bạn đang giải quyết các giới hạn SDK cũ hơn hay không. Cá nhân tôi đã được Apple yêu cầu loại bỏ lệnh gọi phương thức trong bản cập nhật tiếp theo của mình, vì vậy tôi không chắc liệu việc hack cho các thiết bị cũ có được thông qua quy trình phê duyệt hay không.


Đó không phải là trường hợp của iPhone Simulator 3.3.2. Nó vẫn không hoạt động.
Duck

4
@user Làm thế nào để bạn yêu cầu một hướng khi bạn đẩy một chế độ xem trên ngăn xếp?
progrmr

4
Bạn có thể tìm hiểu phân tích tĩnh của Apple. Tôi sử dụng thành công mã không có tài liệu bằng cách sử dụng PerformSelector và dựa vào tính năng động tuyệt vời của Obj-C.
Kenneth Ballenegger

@KennethBallenegger Tôi nhớ đã đọc trong các nguyên tắc và / hoặc thỏa thuận rằng việc ẩn những thứ như vậy có thể khiến ứng dụng của bạn bị xóa và thậm chí có thể bị xóa tài khoản của bạn. Tôi sẽ không mạo hiểm điều đó chỉ để sử dụng API không có giấy tờ.
Ivan Vučica

101

Điều này còn lâu sau thực tế, nhưng đề phòng bất kỳ ai đi cùng không sử dụng bộ điều khiển điều hướng và / hoặc không muốn sử dụng các phương pháp không có giấy tờ:

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

Việc trình bày và loại bỏ bộ điều khiển chế độ xem vani là đủ.

Rõ ràng là bạn vẫn cần xác nhận hoặc từ chối định hướng ghi đè nênAutorotateToInterfaceOrientation của mình. Nhưng điều này sẽ khiến nênAutorotate ... được gọi lại bởi hệ thống.


1
Tuyệt vời, câu hỏi này không được đánh dấu là câu trả lời chính xác của bài đăng này, nhưng điều này đã giải quyết được một nửa vấn đề của tôi stackoverflow.com/questions/5030315 . Thủ thuật chế độ xem mô hình 'ép' định hướng chân dung, bạn cũng biết một thủ thuật để ép phong cảnh chứ?
epologee

5
Há há !! điều này chỉ là quá ngu ngốc! NHƯNG NÓ ĐÃ CÓ TÁC DỤNG! - tất nhiên là thế! : D
hfossli

Tuyệt vời, đã đấu tranh với điều này trong một thời gian dài. Cảm ơn! giao phối
Rahul Choudhary

3
Điều này dường như hoạt động cho cả iOS5 và iOS6: [self presentViewController: [UIViewController new] Animated: KHÔNG hoàn thành: ^ {[self RemoViewControllerAnimated: NO complete: nil]; }];
Inferis

1
Điều này dường như hoạt động trên iOS 7 và iOS 8, nhưng có một màn hình đen đáng chú ý nhấp nháy khi xem (chủ yếu là iOS 8).
levigroker

16

Nếu bạn muốn buộc nó xoay từ dọc sang ngang thì đây là mã. Chỉ cần lưu ý rằng bạn cần điều chỉnh tâm của chế độ xem của mình. Tôi nhận thấy rằng tôi đã không đặt chế độ xem ở đúng nơi. Nếu không, nó hoạt động hoàn hảo. Cảm ơn vì tiền hỗ trợ.

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

Nó cũng sẽ hoạt động nếu tôi đã thêm UIAlertView? Tôi đã thử CGAffineTransformMakeRotationxoay chế độ xem nhưng UIAlertView vẫn theo hướng thanh trạng thái tức là -degreeToRadian (angle)? Bạn đã nhận được một cái gì đó như thế này?
NeverHopeless

Cách dễ nhất để làm điều này với a UIAlertViewlà đặt bộ điều khiển chế độ xem của bạn làm đại biểu của alertView và sau đó trên : - (void) didPresentAlertView:(UIAlertView *) alertView, bạn thực hiện xoay dựa trên dòng điện [UIApplication sharedApplication].statusBarOrientation. Nếu bạn không tạo hiệu ứng cho nó, trông không quá kỳ lạ.
Michael Gaylord

16

Từ những gì tôi có thể nói, setOrientation:phương pháp này không hoạt động (hoặc có lẽ không hoạt động nữa). Đây là những gì tôi đang làm để làm điều này:

trước tiên, hãy đặt định nghĩa này ở đầu tệp của bạn, ngay dưới #imports:

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

sau đó, trong viewWillAppear:phương pháp

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

nếu bạn muốn cái đó được làm động, thì bạn có thể bọc toàn bộ trong một khối hoạt ảnh, như sau:

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

Sau đó, trong bộ điều khiển chế độ dọc của bạn, bạn có thể thực hiện ngược lại - kiểm tra xem nó có đang ở chế độ ngang hay không và nếu có, hãy xoay nó trở lại Chân dung.


1
Thay vì self.view, bạn nên xoay self.window.view. Điều này rất hữu ích nếu bạn có UITabBar hoặc các bộ điều khiển khác ở đầu chế độ xem của bạn.
Borut Tomazin

7

Tôi đang gặp sự cố khi tôi có UIViewControllermàn hình, theo UINavigationControllerhướng ngang. Tuy nhiên, khi bộ điều khiển chế độ xem tiếp theo được đẩy trong luồng, tôi cần thiết bị quay lại hướng dọc.

Điều tôi nhận thấy, là shouldAutorotateToInterfaceOrientation:phương thức không được gọi khi một bộ điều khiển chế độ xem mới được đẩy lên ngăn xếp, nhưng nó được gọi khi bộ điều khiển chế độ xem được bật ra từ ngăn xếp .

Tận dụng lợi thế này, tôi đang sử dụng đoạn mã này trong một trong các ứng dụng của mình:

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

Về cơ bản, bằng cách tạo một bộ điều khiển chế độ xem trống, đẩy nó lên ngăn xếp và bật nó ra ngay lập tức, có thể đưa giao diện trở lại vị trí dọc. Khi bộ điều khiển đã được bật lên, tôi chỉ cần ấn vào bộ điều khiển mà tôi đã định đẩy ngay từ đầu. Về mặt trực quan, nó trông rất tuyệt - bộ điều khiển chế độ xem tùy ý, trống không được người dùng nhìn thấy.


Xin chào, tôi vừa triển khai phương pháp của bạn để buộc VC theo hướng chính xác trước khi đẩy nó, nhưng tôi nhận thấy rằng nó chỉ hoạt động khi buộc các hướng dọc (nếu chế độ xem hiện tại là Portrait và bạn muốn ép VC tiếp theo vào chiều ngang, nó đã thắng 't gọi shouldAutorotateToInterfaceOrientation: khi popping). Bạn đã tìm ra giải pháp để buộc chế độ xem ở chế độ Ngang chưa?
Rafael Nobre

Thật thú vị - tôi chưa gặp vấn đề này, xin lỗi. Tôi sẽ thử chơi với chuỗi các lần đẩy và bật, rất có thể bạn sẽ nghĩ ra điều gì đó.
Andrew Vilcsak

7

Có một cách đơn giản để lập trình buộc iPhone theo hướng cần thiết - sử dụng hai trong số các câu trả lời đã được cung cấp bởi 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];

hoạt động như một sự quyến rũ :)

BIÊN TẬP:

đối với iOS 6, tôi cần thêm chức năng này: (hoạt động trên điều khiển chế độ xem phương thức)

- (NSUInteger)supportedInterfaceOrientations
{
    return (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight);
}

Đối với tôi, nó không hoạt động giống như một sự quyến rũ: Thanh điều hướng và thanh công cụ thu nhỏ lại, đến độ cao mà chúng sẽ có trong chế độ xem Ngang. Các phương pháp với loại bỏ và tái thêm quan điểm trên cùng giữ chiều cao chính xác, nhưng có một nhược điểm quá: chuyển hướng di chuyển thanh của tôi xuống một chút (như là nếu thanh thetering được kích hoạt)
AlexWien

Nó hoạt động theo ý tôi, trên cả phương thức và bộ điều khiển chế độ xem được đẩy. Nhưng chỉ trên iOS 5. :(
Guntis Treulands

Có, tôi cũng có nó để hoạt động trong ios5. Bây giờ trong ios6, chiều cao của thanh điều hướng thu hẹp lại sau khi bộ điều khiển chế độ xem ngang phương thức bị loại bỏ
AlexWien

7

Tôi đã đào và đào tìm kiếm một giải pháp tốt cho việc này. Tìm thấy bài đăng blog này thực hiện thủ thuật: xóa chế độ xem ngoài cùng của bạn khỏi khóa UIWindowvà thêm lại, sau đó hệ thống sẽ truy vấn lại các shouldAutorotateToInterfaceOrientation:phương thức từ bộ điều khiển chế độ xem của bạn, thực thi hướng chính xác được áp dụng. Xem nó: iPhone buộc uiview định hướng lại


Giải pháp này làm việc tốt nhất cho tôi. Quan trọng là, bản sửa lỗi hiển thị modalViewController trống gây ra hoạt ảnh không chính xác khi đẩy các bộ điều khiển chế độ xem vào ngăn xếp. Phương pháp UIWindow này không gặp phải vấn đề tương tự.
Rik Smith-Unna

5

Câu trả lời của Josh phù hợp với tôi.

Tuy nhiên, tôi muốn đăng thông báo "định hướng đã thay đổi, vui lòng cập nhật giao diện người dùng" . Khi bộ điều khiển chế độ xem nhận được thông báo này, nó sẽ gọi shouldAutorotateToInterfaceOrientation:, cho phép bạn đặt bất kỳ hướng nào bằng cách quay lại YEShướng bạn muốn.

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

Vấn đề duy nhất là điều này buộc phải định hướng lại mà không có hoạt ảnh. Bạn sẽ cần phải bao quanh dòng này giữa beginAnimations:commitAnimations để đạt được sự chuyển đổi suôn sẻ.

Hy vọng rằng sẽ giúp.


3

FWIW, đây là cách triển khai của tôi về hướng thiết lập thủ công (để đi vào bộ điều khiển chế độ xem gốc của ứng dụng, 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 ];     
}

kết hợp với UINavigationControllerDelegatephương pháp sau (giả sử bạn đang sử dụng 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 ];
    }
}

Điều đó sẽ đảm nhận việc xoay chế độ xem gốc tùy theo liệu một UIViewControllerthiết bị đến có hỗ trợ hướng thiết bị hiện tại hay không. Cuối cùng, bạn sẽ muốn bắt kịp rotateInterfaceToOrientationcác thay đổi hướng thiết bị thực tế để bắt chước chức năng iOS tiêu chuẩn. Thêm trình xử lý sự kiện này vào cùng một bộ điều khiển chế độ xem gốc:

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

Cuối cùng, đăng ký nhận UIDeviceOrientationDidChangeNotificationthông báo trong inithoặc loadviewtương tự:

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

Đây là câu trả lời duy nhất trên trang này mà tôi đã có thể điều chỉnh thành công với mã bộ điều khiển điều hướng của mình. Một vấn đề nhỏ là thanh điều hướng được xoay không thay đổi chiều cao giữa hướng dọc và ngang như khi xoay qua cơ chế bình thường.
Dan Dyer

@DanDyer bạn đã giải quyết vấn đề với chiều cao sai của thanh điều hướng chưa? (Đặc biệt trong iOS6 chiều cao là sai)
AlexWien

@AlexWien Cuối cùng tôi đã thuyết phục được khách hàng rằng chúng tôi không nên làm điều này. Đối với iOS 6, bạn có thể cần thực hiện điều gì đó với shouldAutorotatephương pháp mới (xem stackoverflow.com/a/12586002/5171 ).
Dan Dyer,

@DanDyer giải quyết nó ngày hôm qua, một ẩn đơn giản và hiển thị hàng hải và statusbar trong viewDidAppear giải quyết it.Now tất cả các công trình (SDK iOS6, mục tiêu ios5) tôi phải kiểm tra lại với mục tiêu iOS6
AlexWien

2

Điều này phù hợp với tôi (cảm ơn Henry Cooke):

Mục đích của tôi là chỉ giải quyết những thay đổi về hướng cảnh quan.

init method:

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

1

Tôi có một ứng dụng mà tôi muốn hỗ trợ xoay thiết bị ở một số chế độ xem nhất định nhưng các ứng dụng khác không có ý nghĩa đặc biệt ở chế độ Ngang, vì vậy khi tôi hoán đổi các chế độ xem, tôi muốn buộc xoay được đặt thành dọc.

Tôi nhận ra rằng bài đăng gốc ở trên trong chủ đề này bây giờ rất cũ, nhưng tôi đã gặp vấn đề tương tự với nó - tức là. tất cả các màn hình trong Ứng dụng của tôi chỉ ở chế độ dọc, ngoại trừ một màn hình, người dùng có thể xoay giữa ngang và dọc.

Điều này đã đủ đơn giản, nhưng giống như các bài đăng khác, tôi muốn Ứng dụng tự động quay lại chế độ dọc bất kể hướng thiết bị hiện tại, khi quay lại màn hình trước đó.

Giải pháp tôi đã thực hiện là ẩn Thanh điều hướng khi ở chế độ ngang, có nghĩa là người dùng chỉ có thể quay lại các màn hình trước đó khi ở chế độ dọc. Do đó, tất cả các màn hình khác chỉ có thể ở chế độ dọc.

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

Điều này cũng có lợi ích bổ sung cho Ứng dụng của tôi là có nhiều không gian màn hình hơn ở chế độ ngang. Điều này rất hữu ích vì màn hình được đề cập được sử dụng để hiển thị các tệp PDF.

Hi vọng điêu nay co ich.


1

Tôi đã giải quyết điều này khá dễ dàng cuối cùng. Tôi đã thử mọi đề xuất ở trên và vẫn rút ra được ngắn gọn, vì vậy đây là giải pháp của tôi:

Trong ViewController cần duy trì Ngang (Trái hoặc Phải), tôi lắng nghe các thay đổi về hướng:

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

Sau đó, trong 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];

    }
}

Hãy nhớ rằng bất kỳ Super Lượt xem / Lượt xem phụ nào sử dụng tính năng tự động lưu trữ, vì view.bounds / frame đang được đặt lại một cách rõ ràng ...

Cảnh báo duy nhất đối với phương pháp này để giữ chế độ xem Phong cảnh, là hoạt ảnh cố hữu chuyển đổi giữa các hướng phải xảy ra, khi tốt hơn là nó có vẻ như không có thay đổi.


1

Giải pháp iOS 6:

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

Mã chính xác phụ thuộc vào mỗi ứng dụng và cũng như nơi bạn đặt nó (tôi đã sử dụng nó trong AppDelegate của mình). Thay thế [[self window] rootViewController]bằng những gì bạn sử dụng. Tôi đã sử dụng a UITabBarController.


0

Tôi đã tìm thấy một giải pháp và viết một cái gì đó bằng tiếng Pháp (nhưng mã bằng tiếng Anh). đây

Cách là thêm bộ điều khiển vào dạng xem cửa sổ (bộ điều khiển phải có triển khai tốt chức năng shouldRotate ....).


-3

Nếu bạn đang sử dụng UIViewControllers, có phương pháp này:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

Quay lại NOcác bộ điều khiển chế độ xem có chứa các chế độ xem bạn không muốn xoay.

Thông tin thêm tại đây


1
Điều đó dừng xoay, những gì tôi đang tìm là buộc xoay trở lại chiều dọc nếu người dùng đang ở chế độ ngang. Tôi đã thêm một ví dụ ở trên để nói rõ hơn ý tôi muốn nói.
Dave Verwer 8/10/08

-3

Tôi không nghĩ rằng điều này có thể thực hiện trong thời gian chạy, mặc dù tất nhiên bạn có thể chỉ cần áp dụng biến đổi 90 độ cho giao diện người dùng của mình.


Có thể với mã mà tôi đã đăng ban đầu, bạn chỉ không bao giờ biết khi nào mã đó có thể ngừng hoạt động;)
Dave Verwer 8/10/08

-3

Đây là những gì tôi sử dụng. (Bạn nhận được một số cảnh báo biên dịch nhưng nó hoạt động trong cả Trình mô phỏng và iPhone)

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

Tôi thấy điều này là đủ để làm cho nó hoạt động trong 4.1. Tuy nhiên vì thanh trạng thái của tôi được thiết lập để ẩn khoảng cách 20pixel tôi đạt được ở đỉnh :(
Anthony chính

setOrientation là api riêng tư và ứng dụng sử dụng nó bị từ chối.
alones
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.