2013-05-08 115 views
13

我想問一下自動佈局和通話狀態欄。以下是一個演示我的問題一個簡單的場景:自動佈局和通話狀態欄

  1. 與「使用故事板」創建項目啓用
  2. 添加「視圖 - 控制器」,並啓用其「在初始視圖控制器」控制器的看法
  3. 設置背景顏色紅色
  4. 添加「表視圖」到控制器的視圖

表視圖應具有4個佈局約束(領先,頂部,後,底部)與常數設定爲上海華0

現在,當我在模擬器中運行這個程序,並按下 + 牛逼我可以看到紅色的背景,而在通話狀態欄的動畫。是否有可能擺脫這種故障呢?

+0

在通話狀態欄將動畫這是一種行爲,即使你的應用程序出來後,你可以檢查。它是'在呼叫狀態欄按鈕中切換'。不知道紅色背景。 – Amit 2013-05-08 12:12:18

+0

看起來像一個類似的問題:http://stackoverflow.com/questions/25882609/how-to-do-do-layout-to-handle-in-call-double-height-status-bar-for-custom-present/42507117 #42507117 – hhamm 2017-02-28 11:30:54

回答

7

(使用的答案,而不是評論由於缺乏聲譽,對不起。)

我就遇到了這個問題,也是並被例如嘗試上面指出的解決方案:它不適合我。

所以我created a repository與示例代碼來揭露原來的海報的問題。有示例應用這些方案:

  1. 自定義視圖控制器窗口的根視圖控制器,
  2. 自定義視圖控制器是一個UINavigationController這是窗口的根視圖控制器的孩子,
  3. 的自定義視圖控制器是UITabBarController的子項,它是窗口的根視圖控制器,並且該自定義視圖控制器是UINavigationController的子項,該UINavigationController是UITabBarController的子項,該UITabBarController是窗口的根視圖控制器。

事實證明,solution from CEarwood實際上工作...當自定義視圖控制器是一個UINavigationController(情況2和4)的孩子。 Hoewever,它在案件1和案件3中不起作用。

我希望這些信息有用。

+0

沒有爲我工作 – 2017-02-07 03:59:42

2

這是來自屏幕調整大小的效果。

當通話狀態欄出現時,視圖將調整爲其在調用狀態欄處於活動狀態時的大小,然後在狀態欄更改大小時向下移動。

在短時間內,表視圖下的視圖是可見的。你可以做的是在向下伸出屏幕的表格視圖下添加一個視圖來掩蓋背景顏色。

另一種方法是用你的AppDelegate,實現:

-application:willChangeStatusBarFrame: 

和調整表視圖,以覆蓋外露得到位。然後當調用 - application:didChangeStatusBarFrame:時,將其重新調整爲原始大小。

7

對於純粹的自動佈局答案,您可以獲得對底部約束的引用,並在收到UIApplicationWillChangeStatusBarFrameNotification時調整它的常量,並在收到DidChange通知時回到0。下面是測試VC我用:

@interface CEViewController() 

@property (nonatomic, strong) IBOutlet NSLayoutConstraint *bottomConstraint; 

@end 

@implementation CEViewController 

- (void)viewDidLoad { 
    [super viewDidLoad];   

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameWillChange:) name:UIApplicationWillChangeStatusBarFrameNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameDidChange:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil]; 
} 

- (void)statusBarFrameWillChange:(NSNotification *)note { 
    NSValue *newFrameValue = [note userInfo][UIApplicationStatusBarFrameUserInfoKey]; 

    self.bottomConstraint.constant = newFrameValue.CGRectValue.size.height; 
    [self.view setNeedsLayout]; 
} 

- (void)statusBarFrameDidChange:(NSNotification *)note { 
    self.bottomConstraint.constant = 0; 
    [self.view setNeedsLayout]; 
} 

@end