2010-10-19 65 views
8

Đây chỉ là một ứng dụng thử nghiệm, Chỉ có một lớp AppDelegate để tạo tất cả những gì tôi đã làm là tạo một ứng dụng dựa trên Cửa sổ, đặt hướng được hỗ trợ cho chỉ cảnh quan trong info.plist và sau đó thêm mã sau đây:Chiều cao và chiều rộng trên iPhone (/ iPad)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
[application setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft]; 

// Override point for customization after application launch. 
UIAlertView *test = [[UIAlertView alloc] initWithTitle:@"hu" message:@"hui" delegate:nil cancelButtonTitle:@"hi" otherButtonTitles:nil]; 
[test show]; 
[window makeKeyAndVisible]; 
    NSLog(@"win %f - %f", window.bounds.size.width, window.bounds.size.height); 
return YES; 
} 

Nếu không có dòng đầu tiên, đặt hướng thanh trạng thái, chế độ xem cảnh báo sẽ xuất hiện theo chiều dọc ngay cả khi phần còn lại của giao diện ở chế độ ngang.

Dù sao Log vẫn mang lại cho này:

win 768.000000 - 1024.000000 

Đây là cách sai tròn (và do đó khi tôi thêm subviews trong ứng dụng thật của tôi các khung là không đúng)

của Apple dường như có thực sự mucked lên trên xoay vòng giao diện, bởi vì tôi đã không có gì, nhưng vấn đề, tôi không nhớ bất kỳ điều này xảy ra trên iPhone, vì vậy xin vui lòng ai đó có thể cho tôi biết làm thế nào để sửa lỗi này.

Tôi sẽ cung cấp 500 danh tiếng (đó là tất cả 10 danh tiếng của tôi) cho người ít nhất có thể giải thích lý do tại sao điều này xảy ra và hy vọng cung cấp giải pháp.

+0

Bạn đang sử dụng phiên bản SDK nào? – ImHuntingWabbits

+0

Tại sao bạn làm điều đó trong AppDelegate? Để giải quyết vấn đề này, tôi tạo một BOOL trong AppDelegate là False cho đến khi phương thức đó được gọi là nơi nó thay đổi thành TRUE. Sau đó, trong viewWillLoad trong MainVC của tôi tôi bắt đầu một bộ đếm thời gian mà kiểm tra nếu AppDelegate BOOL là TRUE. Nếu nó là tôi cháy phương pháp cho thấy cảnh báo. Để làm cho nó trông đẹp hơn, tôi cũng hiển thị hình ảnh mặc định trên MainVC của tôi cho đến khi thông báo xuất hiện. Điều này có vẻ là một cách tiếp cận hacky nhưng tôi không phải luôn luôn hiển thị cảnh báo vì vậy tôi cũng kiểm tra xem. –

Trả lời

17

Tôi nghĩ rằng "Launching in Landscape Mode" của iOS Application Programming Guide chủ yếu giải thích những gì đang xảy ra với ứng dụng thử nghiệm của bạn:

Ứng dụng trong iOS thường khởi động trong chế độ chân dung để phù hợp với định hướng của màn hình Home. Nếu bạn có một ứng dụng chạy trong cả hai chế độ chân dung và phong cảnh , ứng dụng của bạn nên luôn luôn khởi động ở chế độ dọc ban đầu và sau đó để xem điều khiển của nó xoay giao diện như cần thiết dựa trên khuynh hướng của thiết bị. Nếu ứng dụng của bạn chạy trong chế độ phong cảnh duy nhất, tuy nhiên, bạn phải thực hiện các bước sau để làm cho nó khởi động trong một định hướng phong cảnh ban đầu:

  • Trong file Info.plist ứng dụng của bạn, thêm UIInterfaceOrientation và đặt giá trị của nó thành chế độ ngang. Để có hướng ngang, bạn có thể đặt giá trị của khóa này thành UIInterfaceOrientationLandscapeLeft hoặc UIInterfaceOrientationLandscapeRight.

  • Đặt chế độ xem của bạn ở chế độ ngang và đảm bảo rằng tùy chọn tự động hóa được đặt chính xác.

  • Override shouldAutorotateToInterfaceOrientation điều khiển xem của bạn: phương pháp và return YES chỉ cho mong muốn định hướng phong cảnh và NO cho định hướng chân dung.

Chú ý: Các bước trước giả ứng dụng của bạn sử dụng bộ điều khiển xem để quản lý hệ thống phân cấp quan điểm của mình. Xem các bộ điều khiển cung cấp số lượng cơ sở hạ tầng đáng kể để xử lý thay đổi hướng cũng như các sự kiện liên quan đến chế độ xem phức tạp khác . Nếu ứng dụng bạn không sử dụng xem điều khiển-như có thể là trường hợp với trò chơi và OpenGL ES-based khác các ứng dụng của bạn có trách nhiệm xoay bề mặt vẽ (hoặc điều chỉnh lệnh vẽ của bạn) như cần thiết để trình bày nội dung của bạn ở chế độ ngang .

Về ứng dụng thử nghiệm của bạn, phần chính là phần cuối cùng. Bạn không có bộ điều khiển xem, vì vậy bạn hoàn toàn chịu trách nhiệm thiết lập giao diện người dùng theo hướng bạn muốn. Đó là lý do tại sao bạn phải đặt hướng thanh trạng thái theo cách thủ công.

Tôi đọc đoạn đầu tiên nói rằng ứng dụng iOS luôn khởi chạy ở chế độ dọc và sau đó trình điều khiển chế độ xem gốc xoay chế độ xem của nó để khớp với hướng thiết bị ngay lập tức và không có hoạt ảnh sau khi được thêm vào cửa sổ. Điều đó có nghĩa là bản thân UIWindow không xoay nên các kích thước của nó sẽ luôn theo định hướng dọc (như tadej5553 đã nói).Ngoài ra, các khung của tất cả các khung nhìn con UIWindow cũng sẽ theo định hướng dọc (vì khung luôn được xác định trong các tọa độ của chế độ xem của phụ huynh). Vì vậy, bất kể bạn xoay thiết bị như thế nào, khung của bộ điều khiển chế độ xem gốc sẽ luôn theo định hướng dọc. Tuy nhiên, vì thuộc tính giới hạn của khung nhìn được xác định theo các tọa độ riêng của nó, chiều cao và chiều rộng đó phải phản ánh hướng hiện tại của chế độ xem. Không rõ những gì bạn đang cố gắng thực hiện với ứng dụng thực của bạn, nhưng thực hành được khuyến nghị là đặt ra các quan điểm của bạn cho hướng dọc và sau đó đặt thuộc tính autoresizing của chúng để xử lý xoay tự động (cho dù nó xảy ra ngay lập tức sau khi ứng dụng khởi chạy hoặc sau này).

+0

Câu trả lời thực sự tốt, vì vậy tôi sẽ chấp nhận nó và bắt đầu một tiền thưởng khác (không phải là 500 mặc dù: \\) khi tôi có thể và trao nó cho bạn, tuy nhiên cá nhân tôi thích câu trả lời của Deniz để anh ta nhận được tiền thưởng. Bạn giải thích lý do tại sao nó xảy ra nói chung, đó là thực sự hữu ích cho tôi và nếu tôi có thể chia tiền thưởng bây giờ tôi sẽ. –

+0

iPad là một ngoại lệ đối với quy tắc vì màn hình chính có thể xoay ngang. – bentford

3

Thay vì tự lộn xộn với thanh trạng thái, hãy thử đặt UISupportedInterfaceOrientations thành UIInterfaceOrientationLandscapeLeft trong tệp info.plist của bạn. Sau đó, ứng dụng sẽ được thiết lập để hoạt động khi bạn khởi chạy ứng dụng.

Đặt thủ công hướng thanh trạng thái là loại "mức thấp". Bộ điều khiển chế độ xem của bạn cũng cần trả về UIInterfaceOrientationLandscapeLeft trong phương pháp thể hiện shouldAutorotateToInterfaceOrientation.

+0

Xin vui lòng đọc lại câu hỏi của tôi :) bạn sẽ nghĩ rằng những gì bạn đề nghị sẽ làm việc, nhưng nó không. –

+0

xin lỗi về điều đó – Nimrod

+0

Tại sao bạn không có bất kỳ UIView nào? Bạn luôn phải có một container UIView bên trong cửa sổ của bạn theo như tôi biết. Bạn không đặt trực tiếp lượt xem tiện ích bên trong cửa sổ hoặc bạn là ai? – Nimrod

4

Cửa sổ sẽ luôn cung cấp kích thước cho hướng dọc. Luôn luôn.

Nhưng các chế độ xem trên đó sẽ cung cấp các phép đo chính xác (liên quan đến hướng), vì vậy hãy đảm bảo sử dụng các số đo đó.

+0

Tôi đã làm điều này, và nó cũng thay đổi sự khác biệt thanh trạng thái (20 pixel) một cách chính xác nhưng nó vẫn không chuyển đổi chiều rộng và chiều cao. –

+0

Chiều rộng vẫn như 768 khi ở ngang (chiều cao của màn hình nằm ngang là 1024) và ngược lại trong chân dung –

+0

sử dụng các giới hạn, không phải khung của khung nhìn để có tọa độ chính xác – tadejsv

10

UIWindow không biết gì về xoay vòng. Phương pháp quay được đóng gói trong UIViewController. (tự động xoay vv)

UIAlertView sử dụng thuộc tính UIAppertation trạng tháiBarOrientation để chọn hướng của cảnh báo.

// Rotate to a specific orientation. This only rotates the status bar and updates the statusBarOrientation property. 
// This does not change automatically if the device changes orientation. 
@property(nonatomic) UIInterfaceOrientation statusBarOrientation; 

Như bạn thấy từ tiêu đề SDK, trạng tháiBarOrientation không tự động thay đổi. Vì vậy, hoặc là bạn hoặc UIViewController (tự động xoay) nên thay đổi thuộc tính này.

Nếu bạn bắt đầu bức chân dung (đó là phù hợp với định hướng mặc định UIWindow), và sử dụng shouldAutorotateToInterfaceOrientation và để UIViewController để xử lý luân chuyển, nó thay đổi UIApplication của statusBarOrientation trên mỗi thay đổi hướng thiết bị.

Nhưng nếu bạn bắt đầu ở chế độ ngang, bạn nên đặt thủ công trạng tháiBarOrientation cho một lần.

Hy vọng điều này sẽ hữu ích.

+1

Cảm ơn bạn đã giải thích điều khoản của UIAlertView và nói tôi nên làm gì. –

+0

Tôi đã dành quá nhiều thời gian để giải quyết vấn đề này trước khi tìm giải pháp này. Đưa [[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationLandscapeRight hoạt ảnh: NO]; như dòng đầu tiên của loadView của tôi đã làm công việc. Cảm ơn! – Andy

+0

Tôi nghĩ rằng tôi chỉ mất 2h cố gắng để có được ứng dụng iPad của tôi (iOS5) để bắt đầu trong cảnh quan chỉ. Điều này hoạt động, cảm ơn rất nhiều. – Jasper

6

Sử dụng các giới hạn của cái nhìn

3

Dưới đây là những gì tôi đã làm được điều này để làm việc:

  • Trong Info.plist, hãy chắc chắn để có các thông số:
    • giao diện ban đầu orientation = Landscape (nút home right)
    • Định hướng giao diện được hỗ trợ
      • Mục 0 = Landscape (phải nút home)
      • khoản 1 = Landscape (nút home trái)
  • Thêm một xib dựa khiển xem, với một cái nhìn vào nó mà thay đổi kích thước tự động (loại bỏ các vấn đề thay đổi kích thước, vv)
    • Lưu ý Tôi đã sử dụng bộ điều khiển điều hướng ở đây với bộ điều khiển xem vì đó là những gì tôi đã sử dụng, nhưng tôi nghĩ điều này cũng nên hoạt động với một VC duy nhất.

Thêm một chút mã để đại biểu ứng dụng của bạn:

_rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil]; 
_navigationController = [[UINavigationController alloc] initWithRootViewController:self.launcherViewController]; 
[window addSubview:self.navigationController.view]; //I think this is the key. 
[window makeKeyAndVisible]; 

Tôi nghĩ rằng chính là quan điểm, tôi đã thử nó mà không có nó và trên iPhone nó chỉ làm việc tốt, trên iPad mặc dù cảnh báo xuất hiện ở chế độ dọc như bạn nói. Khi tôi thêm chế độ xem trở lại, cảnh báo được hiển thị ở chế độ nằm ngang như mong muốn.

0

Tôi không có gì ngoài vấn đề mã hóa chế độ duy nhất của ứng dụng ở chế độ Landscape. Rất nhiều thời gian không có vấn đề về thị giác nhưng các nút ở dưới 20 pixel không thể chọn được. Tôi đã làm một clipToBounds trên UIWindow chính của tôi và thêm một đường viền trên lớp của nó và tôi có thể thấy rằng UIWindow nằm dưới thanh trạng thái. Tôi đã thử thay đổi x của tôi bù đắp của UIWindow của tôi là 20 (UIWindow vẫn còn trong Chân dung, nội dung của nó là Cảnh) nhưng điều này có nghĩa là UIControllers của tôi đã được chuyển xuống 20 pixel (Không chắc chắn lý do tại sao). Mặc dù đây là một vấn đề khác với máy của bạn, tôi cũng tìm thấy cùng một vấn đề như bạn có trong các giới hạn và khung khi in có vẻ đúng.

Anyways để cắt một câu chuyện dài ngắn tôi đã thay đổi plist của tôi từ UIInterfaceOrientationLandscapeLeft để UIInterfaceOrientationLandscapeRight và cũng thay đổi phương pháp UIViewController tôi để:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 

Và tất cả vấn đề của tôi ra đi. Nhiều lần tôi đã tuyên thệ rằng có lỗi trong mã xoay Apples mà hóa ra là cách tôi đã thực hiện một cái gì đó nhưng tôi nghĩ rằng điều này chắc chắn là một của Apple.

Hãy cho tôi biết nếu điều này khắc phục được sự cố của bạn

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