2012-01-05 33 views
7

Tôi đang thêm UIView vào UIWindow không phải là keyWindow. Tôi muốn UIView xoay khi xoay thiết bị. Bất kỳ thuộc tính đặc biệt nào trên cửa sổ hoặc chế độ xem tôi cần phải đặt? Hiện tại chế độ xem không quay.Chế độ xem phụ UIView của UIWindow không xoay

Tôi biết thực tế là chỉ có tiểu sử đầu tiên của ứng dụng keyWindow được thông báo về xoay thiết bị. Như một bài kiểm tra tôi đã thêm quan điểm của tôi vào tiểu sử đầu tiên của keyWindow. Điều này làm cho chế độ xem xoay vòng. Tuy nhiên quan điểm là một subview của subview đầu tiên của keyWindow sẽ không làm việc vì nhiều lý do thẩm mỹ.

Cách tiếp cận khác là quan sát các thay đổi hướng thiết bị trong chế độ xem và tự viết mã xoay. Tuy nhiên tôi muốn tránh viết mã này nếu có thể (có một cửa sổ bổ sung sạch hơn theo ý kiến ​​của tôi).

Trả lời

7

UIView không xử lý xoay vòng, UIViewController thực hiện. Vì vậy, tất cả bạn cần là để tạo ra một UIViewController, mà thực hiện shouldAutorotateToInterfaceOrientation và bộ điều khiển này như một rootViewController để UIWindow bạn

Something như thế:

UIViewController * vc = [[[MyViewController alloc] init] autorelease]; 

    vc.view.frame = [[UIScreen mainScreen] bounds]; 
    vc.view.backgroundColor = [UIColor colorWithWhite:0 alpha:0.4]; 

    //you vc.view initialization here 

    UIWindow * window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    window.windowLevel = UIWindowLevelStatusBar; 
    window.backgroundColor = [UIColor clearColor]; 
    [window setRootViewController:vc]; 
    [window makeKeyAndVisible]; 

và tôi sử dụng MyViewController này, vì tôi muốn nó để phản ánh các thay đổi của ứng dụng chính

@interface MyViewController : UIViewController 

    @end 

    @implementation MyViewController 

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
    { 
     UIWindow *window = ((UIWindow *)[[UIApplication sharedApplication].windows objectAtIndex:0]); 
     UIViewController *controller = window.rootViewController; 

     if (!controller) { 
      NSLog(@"%@", @"I would like to get rootViewController of main window"); 
      return YES; 
     } 
     return [controller shouldAutorotateToInterfaceOrientation:toInterfaceOrientation]; 
    } 
    @end 

nhưng bạn luôn có thể trả lại CÓ cho bất kỳ hướng hoặc viết logic nào, nếu bạn muốn.

+0

Tôi gặp sự cố tương tự - UIWindow và chế độ xem của nó dường như không xoay - và giải pháp này dường như không hoạt động cho tôi. Tôi làm cho rootViewController của cửa sổ trở thành một bộ điều khiển xoay thành công các bản xem con của nó, nhưng các khung nhìn của cửa sổ không xoay. –

+0

Và họ không nên, gây ra họ đã không gắn liền với UIViewController và chỉ UIViewController quản lý xoay –

+0

Đây là một câu trả lời tuyệt vời, cảm ơn. Nó làm cho xoay trên một cửa sổ thứ cấp "Just Work". Để loại bỏ cửa sổ khỏi màn hình sau, chỉ cần đặt rootViewController thành nil và tham chiếu đến chính nó, vì vậy ARC có thể giải quyết nó. – nobre

2

Bạn có thể thêm bên dưới mã để dự án của bạn

[[NSNotificationCenter defaultCenter] addObserver: tự chọn: @selector (didRotate :) tên: đối tượng UIDeviceOrientationDidChangeNotification: nil];

và tạo chức năng để xử lý.

+0

Tôi muốn quay vòng cho "tự do" hơn là viết 'didRotate' – SundayMonday

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