2012-11-08 10 views
5

thể trùng lặp:
“Incorrect” frame/window size after re-orientation in iPhoneiOS 6 Rotation Bug: Window và Root View Controller khung không thay đổi bất chấp luân

Tôi đang cố gắng để giải quyết một vấn đề rất bực bội với một ứng dụng của tôi - trong nghiên cứu nó tôi có thể đã tìm thấy một lỗi trong iOS:

Khi bạn xoay iPad, chế độ xem quay, nhưng khung của nó không thay đổi. Tôi đang chạy bộ đếm thời gian in ra chiều rộng và chiều cao của chế độ xem mỗi giây và mặc dù tôi có thể thấy chế độ xem xoay trực quan, khung vẫn giữ nguyên "768x1024" bất kể cái gì.

Từ tài liệu của Apple:

Khi giao diện người dùng quay, cửa sổ thay đổi kích cỡ để phù hợp với định hướng mới. Cửa sổ điều chỉnh khung của bộ điều khiển chế độ xem gốc để phù hợp với kích thước mới và kích thước này lần lượt được truyền xuống phân cấp chế độ xem sang các chế độ xem khác.

Đây chính xác là những gì không xảy ra và điều đó gây ra cho tôi mọi rắc rối. Có ai biết làm thế nào để sửa chữa luân phiên để khung thay đổi?

bước để tái sản xuất:

  1. Tạo một dự án có sản phẩm nào mới
  2. Thêm một cổ phiếu xương UIViewController như xem gốc
  3. Thiết lập một bộ đếm thời gian để in ra chiều rộng khung xem điều khiển của rễ và chiều cao
  4. Chạy ứng dụng của bạn và xoay nó xung quanh. Dưới đây là mã của tôi Tôi đang thử nghiệm với:
 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.window.rootViewController = [[UIViewController alloc] init]; 

    NSLog(@"%fx%f", self.window.rootViewController.view.frame.size.width, self.window.rootViewController.view.frame.size.height); 

    // Add a label to confirm orientation 
    UILabel *orientationLabel = [[UILabel alloc] initWithFrame:CGRectMake(10,10,100,30)]; 
    orientationLabel.text = @"Top Left"; 
    [self.window.rootViewController.view addSubview: orientationLabel]; 

    [NSTimer scheduledTimerWithTimeInterval:.3 target:self selector:@selector(testScale) userInfo:nil repeats:YES]; 

    self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
 
- (void) testScale { 
    NSLog(@"%fx%f", self.window.rootViewController.view.frame.size.width, self.window.rootViewController.view.frame.size.height); 
} 
+0

bản sao của http://stackoverflow.com/questions/2686882/incorrect-frame-window-size-after-re-orientation-in-iphone và http:// stackoverflow.com/questions/11150495/ios-uiview-get-frame-after-rotation – Bot

Trả lời

0

Không phải là một lỗi. Điều bạn muốn là sử dụng bounds thay vì frame

Hãy suy nghĩ theo cách này. Khi bạn xoay thiết bị, thiết bị sẽ không thay đổi kích thước màn hình của thiết bị. Nó vẫn như cũ, tuy nhiên quan điểm đang thay đổi. Vì vậy, đây là lý do tại sao bạn muốn sử dụng giới hạn.

+0

Dường như rõ ràng chống lại các tài liệu Apple iOS 6, có nội dung "điều chỉnh khung của bộ điều khiển chế độ xem gốc của nó" – user441669

+0

@ user441669 có nhiều câu hỏi trùng lặp nêu rõ điều này. – Bot

0

Bạn có thể sử dụng trạng thái của Status Bar

[[UIApplication sharedApplication] statusBarOrientation] 

với một lệnh if, bạn có thể biết nếu màn hình là Landscape hoặc Portrait

1

Bạn đã cố gắng đưa UIViewController của bạn bên trong một UINavigationController thay thế? Tôi đã có một vấn đề tương tự và nó đã sửa nó. Lớp UINavigationController dường như xử lý các phép quay tốt hơn UIViewController.

Hãy thử một cái gì đó như thế này:

UIViewController *myViewController = [[UIViewController alloc] init]; 
UINavigationController *myNavigationController = [[UINavigationController alloc] initWithRootViewController:myViewController]; 
self.window.rootViewController = myNavigationController; 
+0

Cảm ơn, tôi sẽ cố gắng vào ngày mai – user441669

+1

Tôi muốn cảm ơn bạn. Tôi đã tìm kiếm 2 ngày trực tuyến để tìm xem liệu có ai đó có thể giải thích tại sao ứng dụng 5.1 của tôi hoàn toàn bị hỏng trong phiên bản 6.1 hay không. Tôi đã nhận được một thanh màu đen giữa navigationBar và UIView, và navigationBar đã không quay, trong khi phần còn lại của xem đã xoay. Dòng ma thuật đơn giản này: \t self.window.navigationController = self.navigationController; trong AppDelegate đã sửa nó cho tôi! Một lần nữa, cảm ơn bạn rất nhiều ! –