2011-07-27 27 views
3

我有一個UIView,我滑動使用UIScrollView。代碼如下所示:加載新子視圖之前調用UIScrollView的setContentOffset

[view setObject:object]; // updates a bunch of labels, images, etc 
[scrollView addSubview:view]; 
[scrollView setContentOffset:CGPointMake(320,0) animated:YES]; 

問題是,滾動視圖似乎並不等待以動畫的contentOffset之前完全加載,所以動畫是有點生澀(第一幾乎不存在滑入和舊設備上)。奇怪的是,切換到第三行修復它:

[UIView animateWithDuration:0.3 animations:^{ 
    [scrollView setContentOffset:CGPointMake(320,0) animated:NO]; 
}]; 

沒有任何滯後,完全平滑的滑入。但是,這不會觸發任何的UIScrollViewDelegate調用,我也依賴這些調用(但不負責延遲)。

任何想法,我怎麼可以告訴UIScrollView等待視圖完全加載之前動畫其contentOffset?或者也許還有別的東西,我錯過了?

編輯:比別人先表明它:是的,我也嘗試:

[self performSelector:@selector(slideIn) withObject:nil afterDelay:1]; 

只是爲了看它是否會解決它。是的,它確實解決了滯後問題,但這不是一個真正的解決方案。 performSelector:afterDelay:永遠不是一個解決方案,它只是一個膚淺的修復。另外,您每次都要讓用戶等待額外的時間(因爲根據設備型號,實際延遲可能會比1秒短得多)。

回答

1

在延遲0.01之後執行選擇器會工作,因爲調用是在runloop上調度的,而不是立即調用該方法。對於這個問題,afterDelay:0.0也可以。沒有嘗試過這種特殊情況,但可能在類似的情況下工作。

+0

很高興知道,謝謝! – samvermette

0

試試這個,設置contentSize延遲一段時間後(這裏延遲2秒)。

[view setObject:object]; 
[scrollView addSubview:view]; 
[self performSelector:@selector(contentSize) withObject:nil afterDelay:2]; 
} 
-(void) contentSize { 
[scrollView setContentOffset:CGPointMake(320,0) animated:YES]; 
} 
+0

是的,我試過了,它修復了它。但這不是一個可行的解決方案。讓用戶等待並不會讓事情變得更好...... – samvermette

+0

您可以檢查視圖是否加載,而不是使用** **。 – Sisu

+0

那你在暗示什麼?在while()循環內調用isViewLoaded或其他東西?這沒有幫助。 – samvermette

1

你試圖開始在視圖 - 控制的「viewDidAppear」功能的滾動...也許當加載完成這就是所謂的。

否則請嘗試延遲很短的時間,如0.01 ..以便在當前工作完成後安排下一次呼叫。

+0

我不能使用viewDidAppear方法,因爲我沒有使用標準機制來呈現VC(我將VC視圖直接添加到視圖層次結構中)。此外,它不是關於視圖被加載,而是setObject:方法來完成它的工作。設置一個0.01延遲確實解決了它...我想知道爲什麼...和更好的修復(這更像是一個黑客)。 – samvermette

+0

當你調用addSubview時,動作並沒有真正完成..它將在視圖的下一次更新完成時完成。當前函數調用完成後,這將在runloop中發生。所以我想你必須在那之後開始動畫.. – Bastian

+0

那是什麼performSelector:afterDelay:呢?有另一種方法嗎? – samvermette

相關問題