2012-01-08 33 views
27

Để thực hiện UIView trên đầu trang của tất cả các quan điểm như hành vi của UIAlertView, cách tốt nhất tôi thấy là bằng cách đặt nó trong cửa sổ ứng dụng, đó là bằng cách thêm xem đến:Xem trên đầu trang của tất cả mọi thứ: UIWindow subview VS UIViewController subview

[[[UIApplication sharedApplication] delegate] window] 

Tuy nhiên, nhược điểm tôi thấy là nó không tự động luân chuyển. Để cho phép quay vòng, cách tốt nhất để thực hiện là bằng cách thêm chế độ xem trên AppDelegate hiện tại window.navigationController/rootViewController, tuy nhiên, bằng cách thực hiện điều này, nó sẽ không còn nằm trên đầu mọi thứ nữa. Hãy nói khi xem được hiển thị và có một popup modalViewController, chế độ xem chắc chắn sẽ bao gồm lên xem.

Câu hỏi của tôi là, có thể thêm chế độ xem phụ vào cửa sổ nhiều nhất hướng hỗ trợ không? Tôi có cần hai tập tin Nib trong trường hợp này không? Làm cách nào để UIAlertView phép thuật kết hợp sự hỗ trợ định hướng trên cùng của &? Khi tôi nhìn vào UIAlertView.h, tôi thấy thực sự có 2 UIWindows, một lần được gọi là originalWindow và một số khác được gọi là dimWindow. Có nơi nào tôi có thể tìm mã nguồn cho UIAlertView.m không?

Trả lời

4

Chỉ tiểu cảnh đầu tiên của UIWindow được thông báo về các thay đổi định hướng. (< iOS8)

Câu hỏi của bạn rất giống với cái này:

Multiple views in a UIWindow

Như câu trả lời có nói, bạn có thể đăng kí thông báo về sự thay đổi định hướng và xử lý relayout của bạn 'trên' subview theo cách đó.

+1

Cách đăng ký chế độ xem với thiết bị để nhận sự kiện xoay? Nó không phải là View Controller, do đó không có chức năng ủy nhiệm cho nó. Tôi có phải nắm bắt UIDeviceOrientationDidChangeNotification để thay đổi hướng tương ứng không? –

2

Đây là giải pháp khả thi, tôi giải thích trong một vài bước.

  1. Bắt đầu Với một lớp UIViewController thừa hưởng thay vì UIView, Cho phép nói rằng lớp có tên TopViewController thừa hưởng bởi UIViewController
  2. Vì bạn bạn không thể đăng ký luân chuyển thiết bị/giao diện trong UIView kế thừa lớp, lớp TopViewController được thừa kế từ UIViewController có các phương thức trả lời các sự kiện xoay vòng. Các sự kiện quay có thể được chụp ngay bây giờ.
  3. Cuối cùng, bạn có thể đặt chế độ xem TopViewController ở đầu UIWindow bằng cách sử dụng cùng một phương pháp mà bạn đã đề cập trong câu hỏi của mình.

    [[[[UIApplication sharedApplication] delegate] window] addSubview:(TopViewController object).view]; 
    

Hope this helps.

+0

Thuộc tính chế độ xem của UIViewController cũng không xoay. Không may. https://developer.apple.com/library/ios/qa/qa1688/_index.html – khunshan

15

Giải pháp tốt nhất mà tôi tìm thấy là tạo chế độ xem vùng chứa trong suốt, thêm vùng chứa đó vào cửa sổ và đặt cảnh báo của bạn bên trong vùng chứa. Sau đó, bạn có thể đăng ký UIApplicationWillChangeStatusBarOrientationNotification để nhận các sự kiện quay và chuyển đổi vùng chứa; điều này cho phép bạn thao tác một cách độc lập khung của các cảnh báo:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    ... 
    self.container = [[UIView alloc] initWithFrame:self.window.bounds]; 
    [self.container addSubview:self.alertView]; 
    [self.window addSubview:self.container]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(statusBarWillRotate:) 
                name:UIApplicationWillChangeStatusBarOrientationNotification 
               object:nil]; 
    ... 
} 
... 
- (void)statusBarWillRotate:(NSNotification *)theNotification 
{ 
    CGFloat rotation = 0; 
    switch ([notification[UIApplicationStatusBarOrientationUserInfoKey] intValue]) 
    { 
     case UIInterfaceOrientationLandscapeLeft: 
      rotation = -M_PI_2; 
      break; 
     case UIInterfaceOrientationLandscapeRight: 
      rotation = M_PI_2; 
      break; 
     case UIInterfaceOrientationPortraitUpsideDown: 
      rotation = M_PI; 
      break; 
     case UIInterfaceOrientationPortrait: 
     default: 
      rotation = 0; 
      break; 
    } 
    CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(rotation); 
    CGSize rotatedSize = CGRectApplyAffineTransform(self.window.bounds, rotationTransform).size; 
    [UIView animationWithDuration:[UIApplication sharedApplication].statusBarOrientationAnimationDuration 
         animations:^{ 
     self.container.transform = rotationTransform; 
     // Transform invalidates the frame, so use bounds/center 
     self.container.bounds = CGRectMake(0, 0, rotatedSize.width, rotatedSize.height); 
     self.container.center = CGPointMake(self.window.bounds.size.width/2, self.window.bounds.size.height/2); 
    }]; 
} 

Bạn có thể, nếu bạn thực sự muốn, tạo ra một cửa sổ hoàn toàn mới với tài sản thiết lập để UIWindowLevelAlertwindowLevel của nó, mà sẽ đảm bảo rằng các cửa sổ vẫn trên hết khác các khung nhìn, bao gồm cả bàn phím, nhưng việc quản lý cửa sổ trở nên phức tạp.Các giải pháp trên nên đủ cho hầu hết các nhu cầu.

Vấn đề với cách thêm xem một cái nhìn khiển của một cửa sổ là nó không được đảm bảo để nhận được tất cả các luân chuyển và view[Will|Did][Disa|A]ppear: điệp trừ khi nó được thêm vào bộ điều khiển xem hệ thống phân cấp qua addChildViewController: trên bộ điều khiển xem gốc.

+0

Tôi gặp sự cố với giải pháp này. Tôi không thể đăng ký các lần chạm trong chế độ xem vùng chứa hàng đầu đó. UIButtons không hoạt động, ví dụ. – asendra

+0

@asendra Âm thanh như cửa sổ của bạn không phải là cửa sổ chính, nhưng bạn có thể muốn đăng câu hỏi của riêng mình với nhiều chi tiết hơn. – Austin

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