問題描述
我正在嘗試設置一個無限(水平)滾動的滾動視圖.
I'm attempting to setup a scrollview with infinite (horizontal) scrolling.
向前滾動很容易——我已經實現了 scrollViewDidScroll,當 contentOffset 接近尾聲時,我將滾動視圖的 contentsize 放大并在空間中添加更多數據(我將不得不處理稍后會產生的嚴重影響!)
Scrolling forward is easy - I have implemented scrollViewDidScroll, and when the contentOffset gets near the end I make the scrollview contentsize bigger and add more data into the space (i'll have to deal with the crippling effect this will have later!)
我的問題是向后滾動 - 計劃是看看我何時接近滾動視圖的開頭,然后當我確實使 contentsize 更大時,移動現有內容,將新數據添加到開頭,然后 -重要的是調整 contentOffset 使視口下的數據保持不變.
My problem is scrolling back - the plan is to see when I get near the beginning of the scroll view, then when I do make the contentsize bigger, move the existing content along, add the new data to the beginning and then - importantly adjust the contentOffset so the data under the view port stays the same.
如果我慢慢滾動(或啟用分頁),這非常有效,但如果我走得快(甚至不是很快!)它會發瘋!代碼如下:
This works perfectly if I scroll slowly (or enable paging) but if I go fast (not even very fast!) it goes mad! Heres the code:
- (void) scrollViewDidScroll:(UIScrollView *)scrollView {
float pageNumber = scrollView.contentOffset.x / 320;
float pageCount = scrollView.contentSize.width / 320;
if (pageNumber > pageCount-4) {
//Add 10 new pages to end
mainScrollView.contentSize = CGSizeMake(mainScrollView.contentSize.width + 3200, mainScrollView.contentSize.height);
//add new data here at (320*pageCount, 0);
}
//*** the problem is here - I use updatingScrollingContent to make sure its only called once (for accurate testing!)
if (pageNumber < 4 && !updatingScrollingContent) {
updatingScrollingContent = YES;
mainScrollView.contentSize = CGSizeMake(mainScrollView.contentSize.width + 3200, mainScrollView.contentSize.height);
mainScrollView.contentOffset = CGPointMake(mainScrollView.contentOffset.x + 3200, 0);
for (UIView *view in [mainContainerView subviews]) {
view.frame = CGRectMake(view.frame.origin.x+3200, view.frame.origin.y, view.frame.size.width, view.frame.size.height);
}
//add new data here at (0, 0);
}
//** MY CHECK!
NSLog(@"%f", mainScrollView.contentOffset.x);
}
隨著滾動的發生,日志顯示:1286.5000001285.5000001284.5000001283.5000001282.5000001281.5000001280.500000
As the scrolling happens the log reads: 1286.500000 1285.500000 1284.500000 1283.500000 1282.500000 1281.500000 1280.500000
然后,當 pageNumber<4 時(我們即將開始):4479.5000004479.500000
Then, when pageNumber<4 (we're getting near the beginning): 4479.500000 4479.500000
太棒了!- 但數字應該會在 4,000 秒內繼續下降,但下一個日志條目顯示:1278.0000001277.0000001276.5000001275.500000等等……
Great! - but the numbers should continue to go down in the 4,000s but the next log entries read: 1278.000000 1277.000000 1276.500000 1275.500000 etc....
從中斷的地方繼續!
僅作記錄,如果滾動緩慢,日志會顯示:1294.5000001290.0000001284.5000001280.5000004476.0000004476.0000004473.0000004470.0000004467.5000004464.0000004460.5000004457.500000等等……
Just for the record, if scrolled slowly the log reads: 1294.500000 1290.000000 1284.500000 1280.500000 4476.000000 4476.000000 4473.000000 4470.000000 4467.500000 4464.000000 4460.500000 4457.500000 etc....
有什么想法嗎????
謝謝
本.
推薦答案
可能是無論在其中設置這些數字,都不會因為您將 contentOffset 設置在其手中而留下深刻印象.所以它只是繼續設置它認為應該是下一個瞬間的 contentOffset - 而不驗證 contentOffset 在此期間是否發生了變化.
It could be that whatever is setting those numbers in there, is not greatly impressed by you setting the contentOffset under its hands. So it just goes on setting what it thinks should be the contentOffset for the next instant - without verifying if the contentOffset has changed in the meantime.
我會將 UIScrollView 子類化并將魔法放在 setContentOffset
方法中.根據我的經驗,所有內容偏移更改都通過該方法,即使是內部滾動引起的內容偏移更改.只需在某個時候執行 [super setContentOffset:..]
即可將消息傳遞給真正的 UIScrollView.
I would subclass UIScrollView and put the magic in the setContentOffset
method. In my experience all content-offset changing passes through that method, even the content-offset changing induced by the internal scrolling. Just do [super setContentOffset:..]
at some point to pass the message on to the real UIScrollView.
也許如果你把你的換檔動作放在那里它會更好.您至少可以檢測到 contentOffset 的 3000-off 設置,并在傳遞消息之前對其進行修復.如果您還要覆蓋 contentOffset
方法,您可以嘗試看看是否可以制作一個虛擬的無限內容大小,然后在后臺"將其縮小到真實比例.
Maybe if you put your shifting action in there it will work better. You could at least detect the 3000-off setting of contentOffset, and fix it before passing the message on. If you would also override the contentOffset
method, you could try and see if you can make a virtual infinite content size, and reduce that to real proportions "under the hood".
這篇關于UIScrollView 無限滾動的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!