2016-11-27 103 views
0

我有一個NavigationVC,我在我的應用程序和共享擴展中都顯示了該圖像,其中只包含搜索視圖和表格視圖。在我的應用中,它看起來是正確的,但在我的共享擴展中,搜索視圖出現20像素太高,並被導航欄遮擋。這樣做沒有意義,因爲打印出表格視圖的框架,搜索視圖以及表格視圖的內容插圖時,它們的外觀之間不應該存在差異。下面是運行應用程序時的截圖:在股延長運行時在iOS共享擴展中未正確佈局的視圖

enter image description here

而且截圖:

enter image description here

這裏的初始化/佈局代碼,我有:

override open func viewDidLoad() { 
    super.viewDidLoad() 
    self.view.addSubview(self.tableView) 
    self.view.addSubview(self.searchView) 
} 

override open func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    self.tableView.frame = self.view.bounds 

    var tableViewContentInsetTop: CGFloat 

    if let navigationBar = self.navigationController?.navigationBar { 
     tableViewContentInsetTop = navigationBar.frame.origin.y + navigationBar.frame.size.height 
    } else { 
     tableViewContentInsetTop = 0 
    } 

    self.searchView.frame = CGRect(
     x: 0, 
     y: self.tableView.frame.origin.y + tableViewContentInsetTop, 
     width: self.tableView.frame.size.width, 
     height: NewConversationViewController.searchViewHeight()) 

    tableViewContentInsetTop += self.searchView.bounds.size.height 

    self.tableView.contentInset.top = tableViewContentInsetTop 
} 

非常簡單 - 它們都被添加到相同的視圖。計算導航欄底部的y座標,並在其中放置搜索視圖。然後,表格視圖除了其高度之外還包含搜索欄y的內容。結果,你會發現,他們會保持一致。實際情況是,tableview正確顯示,正確的內容插入,但搜索欄出現20像素太高。

20個像素可能與狀態欄框架(20個像素高,通常但不總是)未在共享擴展上提供的事實有關。我在這兩種情況下打印了一些日誌。

應用:

table view frame: (0.0, 0.0, 375.0, 667.0) 
search view frame: (0.0, 64.0, 375.0, 40.0) 
navigation bar bounds: (0.0, 0.0, 375.0, 44.0) 
navigation bar frame: (0.0, 20.0, 375.0, 44.0) 
navigation controller frame: (0.0, 0.0, 375.0, 667.0) 
status bar frame: (0.0, 0.0, 375.0, 20.0) 
application bounds: (0.0, 0.0, 375.0, 667.0) 
table view content inset: 104.0 

分享擴展:

table view frame: (0.0, 0.0, 375.0, 667.0) 
search view frame: (0.0, 44.0, 375.0, 40.0) 
navigation bar bounds: (0.0, 0.0, 375.0, 44.0) 
navigation bar frame: (0.0, 0.0, 375.0, 44.0) 
navigation controller frame: (0.0, 0.0, 375.0, 667.0) 
status bar frame: (0.0, 0.0, 0.0, 0.0) 
application bounds: (0.0, 0.0, 375.0, 667.0) 
table view content inset: 84.0 

你可以看到造成不被佔狀態欄架的20像素的差別,但不影響外觀表視圖 - 仍然按預期顯示。這對我來說沒有意義,爲什麼搜索欄會處於與它不同的相對位置。

回答

1

實測值的溶液:未確定

狀態欄框直到viewDidAppear被調用後,但viewWillLayoutSubviews沒有在這一點上調用。所以在viewDidAppear中調用setNeedsLayout修復了它。

至於爲什麼它不利地影響searchView而不是tableView的佈局,我不知道,因爲它們都是普通UIViewController的附加屬性。