當用戶將項目添加到我的列表中時,我想要滾動到新的一行,突出顯示它,並選擇它(它將推動一個新的控制器)。關鍵部分是在推動新控制器之前等待滾動動畫完成。滾動完成後推送視圖控制器
在this answer中,我學會了如何使用動畫委託來等待滾動完成。
但是,如果插入行已經在scree上,則表格視圖將不會滾動並且方法不會觸發。
我該如何等待推動新的控制器直到滾動結束,並處理不會啓動滾動的情況 - 以及如何分辨每種情況之間的區別?
當用戶將項目添加到我的列表中時,我想要滾動到新的一行,突出顯示它,並選擇它(它將推動一個新的控制器)。關鍵部分是在推動新控制器之前等待滾動動畫完成。滾動完成後推送視圖控制器
在this answer中,我學會了如何使用動畫委託來等待滾動完成。
但是,如果插入行已經在scree上,則表格視圖將不會滾動並且方法不會觸發。
我該如何等待推動新的控制器直到滾動結束,並處理不會啓動滾動的情況 - 以及如何分辨每種情況之間的區別?
檢查一個給定的行是否在你的表視圖中可以看到最簡單的方法是這樣的:
if (!CGRectContainsRect([self.tableView bounds], [self.tableView rectForRowAtIndexPath:indexPath])
{
// the row is partially outside the table view’s boundaries and needs to be scrolled for full visibility
}
else
{
// the row is within the boundaries and does not need to be scrolled
}
嘗試創建一個方法來查看是否需要滾動。如果不需要滾動,請立即調用推送,否則等待委託呼叫並推送。
- (BOOL)isSrollingingNeededForIndexPath:(NSIndexPath *)indexPath {
NSArray *visibleIndices = [self.tableView indexPathsForVisibleRows];
for (NSIndexPath *visibleIndexPath in visibleIndices)
if ([indexPath compare:visibleIndexPath] == NSOrderedSame)
return NO;
return YES;
}
編輯:好一點。由於indexPathsForVisibleRows
用於數據呈現。
你可以用indexPathsForRowsInRect
做同樣的事情,你用content.offset.y
和tableview.frame.size.height
來確定你的「可見矩形」。
然後爲了說明頂部和底部的部分可見行,您可以將rowHeight-1
添加到矩形的頂部,並從矩形的底部減去rowHeight - 1
。如果你有靜態高度的行,代碼不應該太粗糙。如果你有不同的高度行,它仍然可以工作,但會涉及更多。
儘管如此,它看起來像很多代碼,你會認爲會有一個簡單的答案。
感謝。這種方法唯一的問題是根據tableview,部分可見行是'可見的',所以不會觸發滾動。使用普通的滾動方法,tableview可以正確識別出部分行,並將其向上/向下滾動一下以放在屏幕上。 –
這對我來說破解了,除了我認爲參數應該顛倒嗎? –
哎呀,你是對的。當我第一次寫我使用CGRectIntersectsRect並且在我替換它時沒有改變順序。固定。 –