[英]Setting a minimum content size on a UITableView
我在視圖控制器的頂部有一個視圖,在它的下面有一個tableview。
我這樣做的原因是,隨着tableview向上滾動,top view也向上滾動,最多可以滾動50點。
tableview的頂部插圖也為50:
tableView = UIEdgeInsets(top: 50, left: 0, bottom: 0, right: 0)
...,以便其單元格從頂視圖下方開始。
在scrollview委托中,有一些代碼類似於:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let scrollViewYOffset = ...
topViewHeightConstraint.constant = max(minTopViewHeight, minTopViewHeight - scrollViewYOffset)
}
這樣可以確保當用戶在表格視圖上向下拖動時,頂視圖會“黏附”到該視圖上,並且當用戶將表格視圖向上推時也會被頂起。
我繪制了這張圖片,以更好地描述情節提要的外觀:
到現在為止還挺好。 當單元格很多並且用戶向上滾動表格視圖時,頂視圖會很好地保持在其最小高度。
但是,如果您向上滾動-頂視圖處於最小狀態-則單元數會減少,頂視圖會回切到其最大高度。
這是因為tableview的實際內容大小已降至其邊界高度以下,因此,作為scrollview,它會將內容的頂部再次帶到scrollview的頂部(當然還要加上50點的頂部插圖)。
我希望能夠向上滾動tableview,因此無論其包含的單元格數量如何(即,無論其內容大小如何),頂視圖都保持其最小高度。
誰能想到在表格視圖上設置最小內容大小的巧妙方法?
(到目前為止,我已經嘗試弄亂頁腳,在底部有一個單元格,該單元格實際上是一個分隔符-這弄亂了tableview的邏輯和我在其中的一些重新排序代碼。我試圖強制要約等。盡我所能,但還沒有弄清楚如何實現這一目標。)
我將不勝感激一些UI天才將我指向正確的方向:)謝謝。
更新:
感謝您的所有回答和評論。
在嘗試了各種類型的頁腳和頁眉視圖,調整滾動的約束和布局優先級,添加間隔單元格,將表格視圖放入滾動視圖等之后-最終我想到,這使我變得比需要的更加復雜,應該只需在scrollViewDidScroll上的contentInset
值上更新問題的原因。
請參閱下面的答案,以獲取實現我所尋找的行為的代碼示例。
您可以嘗試的一些想法:
在索引0上創建一個“虛擬”行,並將其高度設置為50(它將隱藏在頂視圖下方)。 也許您可以在第0節中保留該虛擬行,而在第1節中保留其余數據,因此在刪除數據時不必考慮它。
或者,您可以將tableView標題的高度設置為50,而不是虛擬行
也許在tableView上設置一個最小高度限制,並保持其內容壓縮優先級為高。
由於contentInset
是導致tableview ping回錯誤點的原因,因此我只需要在上/下滾動tableview時調整內容插入。
這是我所做的一些示例代碼:
let maxPointsTopViewCanMoveUp: CGFloat = 50
let topInset = abs(min(max(-maxPointsTopViewCanMoveUp, scrollView.contentOffset.y), 0))
scrollView.contentInset = UIEdgeInsets(top: topInset, left: 0, bottom: 0, right: 0)
scrollView.scrollIndicatorInsets = UIEdgeInsets(top: topInset, left: 0, bottom: 0, right: 0)
let amountToMoveTopViewUp = maxPointsTopViewCanMoveUp - topInset
topViewToSuperviewTopConstraint.constant = amountToMoveTopViewUp
這是從表scrollViewDidScroll
中調用的。
這意味着,當表格視圖中的單元格太少而無法填充內容時,表格視圖的頂部將停留在其向上滾動的位置(即,將其向上推的數量)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.