2016-08-20 132 views
1

我的應用程序的層次結構看起來像這樣enter image description here子視圖控制器來調整containerView

主視圖控制器(讓我們稱之爲控制器1)包含一個滾動視圖,圖像以及指向其它的viewController和將數據傳送給的tableView一個containerView 。

控制器1的滾動視圖被設置爲使用約束正確調整大小,以便containerView可以在高度上增長。

問題是tableView有動態加載的數據,它的大小發生了變化,但是這並不反映在containerView上。我需要我的containerView通知有關tableView的新大小,以便它可以相應調整大小,用戶可以滾動瀏覽整個屏幕,而不僅僅是默認大小的containerView。

我希望這是有道理的。

我讀了一些名爲preferredContentSizeDidChange的東西,但我不確定如何正確實施它,或者它是否適用於我的情況。

實施

override func preferredContentSizeDidChangeForChildContentContainer(container: UIContentContainer) { 
    super.preferredContentSizeDidChangeForChildContentContainer(container) 
    print(container) 
} 

在控制器1並沒有影響

+0

你也可以在你的ContainerView中實現你自己的委託方法(設置高度約束) - 並從你的childViewController(TableView)調用它來更新高度。 – derdida

+0

我不知道你是否可以測試這個,但是,如果你沒有頂層的滾動視圖,會不會有問題? –

+0

請告訴我,如果我正確理解你的問題。你希望容器隨着表視圖數據的增加而增長(這將阻止它滾動,因爲tableview的完整數據不會溢出),然後當它達到屏幕的總高度時,容器視圖應該停止增長並且tableview會溢出並開始滾動? – kerry

回答

0

這是一個老問題,但希望它會幫助別人!我能夠動態調整大小的容器做以適合其內容如下:

在我的嵌入式的UITableViewController,我說:

preferredContentSize.height = tableView.contentSize.height 

要更改容器的大小,我添加了嵌入式視圖控制器因爲我父視圖控制器的孩子:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let destination = segue.destination as? MyTableViewController { 
     addChildViewController(destination) 
    } 
} 

最後,我增加了對容器和其高度約束的出口,並增加了以下父視圖控制器:

override func preferredContentSizeDidChange(forChildContentContainer container: UIContentContainer) { 
    super.preferredContentSizeDidChange(forChildContentContainer: container) 
    if let child = container as? MyTableViewController { 
     containerHeightConstraint.constant = child.preferredContentSize.height 
     container.updateConstraints() 
    } 
} 
相關問題