2009-09-27 37 views
7

Tôi đã thiết lập ba ViewControllers để xử lý ba chế độ xem. Vấn đề mà tôi đang gặp là ở chế độ mô phỏng, hướng LandscapeRight (đó là thứ tôi muốn) và chế độ xem đầu tiên hiển thị chính xác ở chế độ xem ngang đó, nhưng khi tôi chuyển sang chế độ xem thứ hai và thứ ba, chúng sẽ hiển thị xoay 90 độ ngược chiều kim đồng hồ với góc trên bên trái của chế độ xem ở góc dưới bên trái của màn hình của điện thoại. Tôi đã cố gắng để gỡ lỗi này trong một vài ngày và gần nhất mà tôi đã nhận được một đầu mối là truy tìm nó theo cách sau:Chỉ lần đầu tiên UIView thêm chế độ xem addSubview hiển thị đúng hướng

Sau đây là trong ứng dụng ủy quyền của tôi:

NSLog(@"1"); 
[window addSubview:welcomeController.view]; 
NSLog(@"2"); 
[window addSubview:goalController.view]; 
NSLog(@"3"); 
[window addSubview:planningController.view]; 
NSLog(@"4"); 

[window bringSubviewToFront:welcomeController.view]; 
NSLog(@"5"); 

mỗi ViewControllers tôi thực hiện một cái gì đó tương tự như sau (thay đổi duy nhất là tên của bộ điều khiển chuyển ra trong chuỗi truyền cho NSLog):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Return YES for supported orientations 
NSLog(@"called for WelcomeController"); 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 

với điều đó, tôi nhận được đầu ra sau trên Console:

a 
called for WelcomeController 
called for WelcomeController 
called for WelcomeController 
called for WelcomeController 
2 
called for GoalController 
3 
called for PlanningController 
4 
5 

Tôi tìm thấy điều thú vị làAutorotateToInterfaceOrientation được gọi là 4 lần cho chế độ xem đầu tiên được thêm vào, trong khi hai chế độ khác chỉ được gọi một lần. Tôi hy vọng rằng điều này có thể là vì nó phải thực hiện một số thiết lập lúc đầu (và tôi tin rằng trình mô phỏng bắt đầu ở chế độ dọc, vì vậy nó có thể gọi nó trong khi đang quay), nhưng tôi thấy sự tương quan có chút nghi ngờ.

Tôi đã chuyển thứ tự xung quanh để addSubview được gọi cho mục tiêuController đầu tiên và welcomeController thứ hai. Trong trường hợp này, đó là goalController hiển thị theo hướng ngang chính xác (thường là bộ điều khiển chào mừng). Điều này dường như để loại bỏ các tập tin XIB của tôi và ViewControllers mình. Tôi không chắc tại sao cái nhìn đầu tiên mà addSubview được gọi là đặc biệt. Tôi cũng đã thử sử dụng insertSubview tại chỉ mục 0 với cùng kết quả.

Trả lời

0

Tôi có số similar issue. Không chắc chắn lý do tại sao. Nhưng cách giải quyết là gọi điều này trên mọi chế độ xem sau lần xem đầu tiên:

[planningController.view setFrame: CGRectMake (0, 0, 480, 300)];

và trước -addView. Tôi tò mò nếu điều này giúp bạn ra ngoài. Nếu tôi không phải là người duy nhất có vấn đề này và cách giải quyết này, thì có lẽ có một lý do.

+0

Điều này dường như không giúp mã của tôi. Tôi đã thử đặt các cuộc gọi cho cả hai targetController và planningController trước và sau các cuộc gọi addSubview tương ứng (tôi thậm chí đã thử chuyển đổi 300 và 480;) Nó dường như tạo sự khác biệt tại một số điểm bởi vì thay vào đó có chế độ xem chào mừng trong nền của phần của màn hình không được bao phủ, nó chỉ là màu trắng, vì vậy tôi nghĩ rằng nó phải được kéo dài một cái gì đó trên màn hình. –

+0

Một điều mà tôi nhận thấy từ bài đăng của bạn là dường như bạn có chế độ xem bảng đang hiển thị ở chế độ dọc, để lại khoảng 1/3 khoảng trống trang. Tôi đang nhận được cùng một điều, ngoại trừ quan điểm của tôi được xoay 90 độ để những gì nên được đầu là chỉ còn lại. –

+0

Tôi thiết kế mọi thứ trong IB với định hướng phong cảnh, đó có thể là lý do tại sao mọi thứ đang hướng đúng cách, nhưng không chiếm toàn bộ màn hình. Tôi bắt đầu với mainWindow, tới viewControllers, và các khung nhìn, tất cả đều ở trong khung cảnh. Giống như bạn, nếu tôi thay đổi thứ tự bộ điều khiển chế độ xem của tôi, thì tùy theo điều kiện nào trước tiên, không cần cuộc gọi setFrame. – mahboudz

4

Chạy cùng vấn đề và dường như thêm các bản xem trước vào UIWindow không hoạt động theo cách tôi mong đợi. Tôi quản lý để giải quyết vấn đề sau khi thêm một "giả" UIViewController đó là chỉ xem phụ trong UIWindow. Sau khi thêm cái đó, nó hoạt động hoàn hảo để thêm nhiều bản xem trước vào bộ điều khiển giả, tất cả đều có định hướng chính xác.

Vì vậy, mã duy nhất trong lớp trình điều khiển "giả" là hàm "shouldAutorotateToInterfaceOrientation". Điều này cũng phải phù hợp với chức năng tương tự trong tất cả các bản xem trước khác.

Hy vọng điều đó sẽ hữu ích.

+1

Điều này không hiệu quả đối với tôi (trên iPad). Tôi không noobsor, nhưng điều này là rất khó chịu. – tobyc

+0

Không hoạt động cho tôi ... – Karthik

0

Điều này cách xa lý tưởng. Nhưng bạn có thể hack các lượt xem thứ hai biến đổi để nó được xoay một cách chính xác. Điều này phù hợp với tôi vì ứng dụng của tôi chỉ ở chế độ ngang. Nó có thể không lý tưởng nếu bạn muốn thay đổi định hướng.

[window addSubview:firstController.view]; 
[window addSubview:secondController.view]; 
CGAffineTransform rotate = CGAffineTransformMakeRotation(M_PI/2.0); 
[backgroundViewController.view setTransform:rotate]; 
CGRect contentRect = CGRectMake(0, 0, 1024, 768); 
backgroundViewController.view.bounds = contentRect; 
[backgroundViewController.view setCenter:CGPointMake(768/2, 1024/2)]; 

0

Tôi nghĩ rằng tôi có giải pháp cho điều này có vẻ hoạt động. Thêm chế độ xem và sau đó xóa ngay, lặp lại cho mỗi chế độ xem, sau đó thêm cả ba. Như thế này:

[window addSubview:welcomeController.view]; 
[welcomeController.view removeFromSuperview]; 
[window addSubview:goalController.view]; 
[goalController.view removeFromSuperview]; 
[window addSubview:planningController.view]; 
[planningController.view removeFromSuperview]; 

[window addSubview:welcomeController.view]; 
[window addSubview:goalController.view]; 
[window addSubview:planningController.view]; 

Dường như hoạt động, ít nhất là trong trình giả lập.

+0

Tính năng này hoạt động với tôi trên trình mô phỏng iPad 4.2, nhưng không hoạt động trên 3.2 (mà tôi không may vẫn phải hỗ trợ). –

Các vấn đề liên quan