2013-02-27 74 views
3

在我的應用程序,我通過簡單的縮放整個窗口,以適應其在剩餘屏幕空間處理的狀態欄幀的變化:處理應用程序:willChangeStatusBarFrame:

- (void)application:(UIApplication *)application willChangeStatusBarFrame: 
    (CGRect)newStatusBarFrame { 

    UIView* window = [UIApplication sharedApplication].keyWindow; 

    [UIView animateWithDuration:1/3.f animations:^{ 
     CGFloat heightDifference = newStatusBarFrame.size.height - 
      kWXDefaultStatusBarHeight; 

     [window setTransform:CGAffineTransformMakeScale(1.f, 
      heightScaleForCallStatusBar())]; 
     [window setFrame:CGRectOffset(window.frame, 0, heightDifference - 
      kWXDefaultStatusBarHeight/2)]; 
    }]; 
} 

這工作,但如果窗口在通話過程中縮小比例,我提出了一個視圖控制器-presentViewController:animated:completion:,新的控制器不使用縮放的座標系,它使用未縮放的座標系,並且UI被破壞。任何想法如何讓窗口的.transform轉移到所呈現的新視圖控制器?

另外,有沒有另一種方式來處理通話狀態欄,而無需重新安排我的所有UI元素?

+0

什麼是「通話中」? - 哦,你的意思是一個*電話*電話! – matt 2013-04-08 23:39:16

+0

真的只是一個副本http://stackoverflow.com/questions/5486491/how-in-call-status-bar-impacts-uiviewcontrollers-view-size-and-how-to-handle – matt 2013-04-08 23:41:06

回答

3

每個視圖控制器將其視圖的框架設置爲可用空間。處理這個問題最簡單的方法是確保視圖的彈簧和支撐或自動佈局屬性允許壓縮或擴展視圖。隨着iPhone世界現在包括多種屏幕尺寸,這是一個很好的通用做法。但是,如果您打算在視圖上使用變換來處理調整大小,則可以在視圖控制器(可能位於公共基類中)中實現-viewWillLayoutSubviews以在視圖控制器的根視圖上設置變換。

編輯

在調查,似乎在通話狀態欄的變化不會導致-viewWillLayoutSubviews被調用。但是,以下代碼(在通用視圖控制器基類中)適用於我:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(statusFrameChanged:) 
               name:UIApplicationWillChangeStatusBarFrameNotification 
               object:nil]; 
} 

- (void)viewDidUnload 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:UIApplicationWillChangeStatusBarFrameNotification 
                object:nil]; 
    [super viewDidUnload]; 
} 

- (void)statusFrameChanged:(NSNotification*)note 
{ 
    CGRect statusBarFrame = [note.userInfo[UIApplicationStatusBarFrameUserInfoKey] CGRectValue]; 
    CGFloat statusHeight = statusBarFrame.size.height; 

    UIScreen *screen = [UIScreen mainScreen]; 
    CGRect viewRect = screen.bounds; 

    viewRect.size.height -= statusHeight; 
    viewRect.origin.y = statusHeight; 
    self.view.frame = viewRect; 
    [self.view setNeedsLayout]; 
} 

- (void)viewWillLayoutSubviews 
{ 
    [super viewWillLayoutSubviews]; 

    CGRect baseFrame = self.view.frame; 
    // 548.0 is the full height of the view. Update as necessary. 
    CGFloat scale = self.view.frame.size.height/548.0; 
    [self.view setTransform:CGAffineTransformMakeScale(1.0, scale)]; 
    self.view.frame = baseFrame; 
} 
+0

我遇到了麻煩這與UITabBarController。這似乎是第一次--viewWillLayoutSubviews被稱爲選項卡欄不存在,所以視圖的比例設置得太大,因爲高度計算在460時,真正與標籤欄控制器,高度是411. – 2013-04-09 15:47:06

+0

我只是更新我的測試項目與UITabBarController作爲根VC,它的工作正常...你是手動添加標籤欄?好像你可能需要在這裏提供更多的代碼。 – 2013-04-09 19:40:12

+0

我正在通過故事板添加我的標籤欄控制器。 – 2013-04-10 01:13:18