2011-12-10 58 views
2

我使用UIScrollView來顯示自定義UIView。當用戶drags手指橫過UIScrollView時,在顯示開始更新之前存在明顯的延遲。如果用戶在屏幕上保持touching,則短時間後UIScrollView會變得非常敏感。隨後的嘗試scroll導致相同的初始延遲,然後是高響應。這種延遲嚴重影響了視圖的可用性,我想擺脫它。UIScrollView - 如何擺脫滾動前的延遲?

在我編寫的一個測試項目中,試圖深入瞭解這個問題的底部,我只能部分複製該行爲。用戶scrolls第一次是完全一樣的 - 但是任何後續嘗試scroll都會立即作出響應。

我已經嘗試了設置delaysContentTouches = NO和子類UIScrollView,使touchesShouldBegin returns NO建議在多個地方在線,但都沒有工作。

我在iOS 4.3上使用MonoTouch,但是Objective-C的答案沒有問題。我會張貼代碼來幫助說明問題,但由於我一直無法縮小這個問題,這將超過1000行。希望這是獲得解決方案的足夠信息。

有誰知道什麼可能會導致這種延遲,以及如何擺脫它?

+1

使用Time Profiler在Instruments下運行您的應用程序。暫停期間CPU是否忙碌?還是閒置? –

+0

良好的通話 - 這樣做直接導致了問題的原因。 – rankAmateur

回答

2

提高滾動性能的一些常規建議。

有你的滾動視圖光柵屏外:

myView.layer.shouldRasterize = YES; 

設置該屬性上滾動視圖每個子視圖 - 不設置它的那些子視圖的孩子,或者你只是吃了內存的方式。

如果你的滾動視圖不需要合成,請確保你把那混合關閉:使用模擬器通過利用出現了iOS模擬器調試菜單上的這兩個特點

myView.opaque = YES; 

測試:

  • 顏色關閉屏幕渲染
  • 顏色混合圖層

如果這樣不能解決您的問題,並且您已經實現了UIScrollViewDelegate,請仔細檢查以確保您在這些方法中沒有耗費任何時間 - 例如,根據您的描述,您可能會在中執行某些操作scrollViewDidScrollscrollViewWillBeginDraggingscrollViewWillBeginZooming如果你是這樣,優化,所以它發生在滾動甚至開始之前。另外,請確保你沒有做任何事情touchesBegan

+0

謝謝 - 事實證明,我(無意中)在scrollViewWillBeginDragging中執行了非常耗時的操作,導致延遲。一旦我優化了,沒有問題。 – rankAmateur

1

我懷疑發生了什麼是您的滾動視圖的內容中啓用了某種交互。

系統不知道初始觸摸是否會觸碰其中一個子視圖或拖動滾動視圖,因此在等待查看您是否要擡起手指。

UIScroll視圖的子視圖是什麼?

作爲一個實驗設置的UIScrollView中的所有子視圖有userInteractionEnabled = NO,這不會是你想要的,但它只是一個測試。在此之後應該滾動罰款,否則我錯了。

+0

感謝您的回覆 - 在我的情況下,這不是導致問題的用戶交互,而是scrollViewWillBeginDragging中的方法調用。 – rankAmateur

+0

很好 - 編輯我的答案,具體包括scrollViewWillBeginDragging。 –

+0

@rankAmateur阿好吧,這是有道理的。出於興趣,委託方法出了什麼問題,執行時間太長了? – Robert