2017-04-08 130 views
3

tl; dr我不想在UIScrollView's內容窗口的頂部上方增加UIViews的大小,以將內容向下推動。如何在增加內容大小時防止內容偏移

我有一個UIScrollView顯示的許多UIStackViews列表,的UIStackViews的好處之一是,當你設置isHidden = false其子視圖之一,它會自動調整以補償新觀點。現在

,每個項目都有這些UIStackViews之一,用戶可以按下一個按鈕,它將isHidden = false到子視圖中的每一個,一下子。這意味着,每個列表項將增加一個等於未隱藏視圖高度的量(每個堆棧視圖的高度相同)。

如果滾動視圖的contentOffset爲零,則沒有任何問題,因爲所有增加的高度都會向下推動所有其餘內容,並且在所有視圖都未隱藏後,用戶仍然位於滾動視圖的頂部。

問題是當用戶不在滾動視圖的頂部。當這種情況出現時,用戶按下取消隱藏所有視圖的按鈕,高度增加將向下推動所有視圖,從而呈現向上滾動的外觀。用戶進一步向下滾動到列表中,其上方的視圖越多,並且用戶按下按鈕時的內容移位越大。

我正在查找的行爲與用戶在滾動到視圖頂部時按下按鈕時的行爲相同,但在任何滾動位置都是如此。換句話說:無論用戶在哪裏滾動,當他們按下按鈕時,只有下推的視圖纔是滾動視圖內容窗口頂部的視圖。

任何想法如何做到這一點?

回答

2

好吧,讓我看看我是否正確理解你的問題。

這是狀態滾動視圖

A 
B 
C 
D 
E 

當用戶按下「全部展開」按鈕,它看起來像這樣:

A 
-1 
-2 
-3 
B 
-1 
+-a 
+-b 
-2 
C 
-1 
-2 
-3 
D 
-1 
-2 
E 
-1 
-2 
-3 
-4 

的問題是,如果用戶是目前正在研究

+---+ 
|D | 
|E | 
+---+ 

(這是在列表中的第4和第5項) 他們最終在展開的列表中看到:

+---+ 
|B | 
|-1 | 
+---+ 

但他們應該看到他們在看之前的項目D

我可能會推薦使用UITableView,因爲您可以存儲當前可見的TableViewCells,然後作爲視圖動畫,滾動到當前單元格(應該保持它在視圖中相對)。

在你的情況下,與UIScrollView什麼,我會建議被捕獲當前可見子視圖(使用電流contentOffset/Size和子視圖的幀),然後搞清楚他們的觀點激發它的大小轉換之後,和然後滾動到新的位置。

正如我所提到的,這是一個更適合於UITableViewUICollectionView的任務,其中父對象由操作系統進行跟蹤和緩存,並且有特定的規則來管理行/單元格的插入/刪除操作。

HtH

+0

確切地說。然而,這一切都發生在for循環中,因此在每次迭代中,新視圖都將被隱藏。這意味着在每次迭代中,我將不得不滾動到新的位置,除非我能以某種方式保證這一切發生在相同的佈局傳遞中,對嗎?如果它不全都發生在同一佈局階段,那麼我如何保證用戶在每次滾動到新位置時都看不到滾動視圖。我希望從用戶的角度來看,沒有滾動的證據。 – shoe