在以下代碼示例中,self.contentView
指的是UIScrollView
。UIScrollView無法滾動到iOS 7底部
// Scroll to bottom.
CGPoint bottomOffset = CGPointMake(0, self.contentView.contentSize.height -
self.contentView.bounds.size.height);
if (bottomOffset.y >= 0.0)
{
[self.contentView setContentOffset:bottomOffset animated:YES];
}
奇怪的是,在IOS 6這個工作完全正常,但在IOS 7滾動視圖(假定它有一個contentSize
這是垂直大於它的frame.size.height
)僅滾動到最底部子視圖加入到最底部滾動視圖。
例如,如果在下列情況下成立:
self.contentView.frame.size.height == 50.0
self.contentView.contentSize.height == 100.0
aSubView.frame.origin.y == 50.0
aSubView.frame.size.height == 20.0
滾動代碼只會滾動,直至aSubView
可見; self.contentView.contentOffset.y == 20.0
而不是self.contentView.contentOffset.y == 50.0
,它將位於整個滾動視圖的底部。
這是(當然)發生,直到以編程方式將另一個子視圖添加到self.contentView
(通過用戶交互),然後一切都自行糾正。
爲了清楚起見,我在滾動代碼之前和之後設置斷點以測量對self.contentView.contentOffset
的更改。
其他有趣的事實,如果我刪除animated
並直接設置contentOffset
它在iOS 7上按預期工作,但我更喜歡保留動畫。
注:不使用界面生成器
爲什麼不令人滿意?動畫代碼應該始終在主線程上運行,並且只需確保它與此相關即可。您需要強制執行的內在原因以及應用程序不會自動使其在主線程上運行必須與某些可能只有Apple工程師才能解釋的內部工作相關。 – manecosta
這是不令人滿意的,因爲代碼已經在iOS 6中沒有調度塊的情況下工作,而且這個代碼只能在主線程上執行,所以它應該在沒有額外的調度塊的情況下工作。 事實上,我必須強制程序等待,直到當前的Runloop循環完成,執行該代碼行之前的任何操作都會顯示缺少對調用該方法時發生的事情的理解。 –
這種行爲很奇怪。強制使用主隊列解決了我遇到的滾動問題...謝謝你的幫助。 – Vico