Pages

星期三, 11月 30, 2011

[iOS] 拖拉(Drag)不流暢,原來是因為...

這兩天開始針對之前所撰寫的iOS程式做收尾的動作,針對其中一些尚不流暢的地方做改善。其中有一個問題一直不知道是什麼原因造成的,就是拖拉UIImageView或是UIView時,有的時候很順,有的時候就又感覺鈍鈍的,有中斷的感覺。

本來以為是自己程式在touchesMoved事件中沒有寫好的關係,但看了許多其他的文章,覺得自己寫的應該是沒有什麼問題才是。後來加入一些log去看,發現拖拉(Drag)中斷的原因都是因為發生了touchesCancelled事件,而且並沒有接著發生touchesBegan事件,顯然是在拖拉間,我的touchesMoved被其他process給cancelled掉了。

在花了一點時間根據上述的情形做搜尋後,終於讓我找到了答案:

原來當你的UIView上有 UIGestureRecognizers時, UIGestureRecognizers會自動cancel目前正在發生的touch event,如果 UIGestureRecognizers認為現在的touch event是屬於它的gesture時。因此,這個時候,為了避免 UIGestureRecognizers干擾你的touch event, UIGestureRecognizers中的一個property: cancelsTouchesInView就必須設定為NO (預設為YES)。原始出處 http://stackoverflow.com/questions/5818692/how-to-avoid-touches-cancelled-event

另外,UIScrollView也有同樣的問題,如果你在UIScrollView中要執行Drag動作時,UIScrollView也會cancel你的動作如果它認為目前的動作是scroll的話。這時就要將UIScrollView中的一個property: CanCancelContentTouches設定為NO,就可解決這個問題。原始出處 http://www.iphonedevsdk.com/forum/iphone-sdk-development/49840-touchescancelled-called-unexpectedly.html#post286709

沒有留言:

張貼留言