2012-09-04 61 views
2

我有一個包含UIImageView的UIScrollView。 UIScrollView允許通過UIImageView縮放和平移。UIScrollView touchesMoved不叫

問題是,我想每次都知道手指的動作,並且我試圖用touchesMoved方法來捕捉事件。 但它不工作,儘管touchesBegan和touchesEnded被調用正確。

事實上,如果手指移動很小,並且UIScrollView沒有開始平移,則會調用touchesMoved。在UIScrollView開始移動的那一刻,事件停止被調用。

有人知道是什麼問題,以及如何解決它? 我以爲也許裏面的UIImageView捕捉事件或類似的東西。

回答

0

創建的UIScrollView類的子類,並覆蓋的touchesBegan:和其他觸摸方法如下:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    // If not dragging, send event to next responder 
    if (!self.dragging) 
    { 
     [self.nextResponder touchesBegan: touches withEvent:event]; 
    } 
    else 
    { 
     [super touchesEnded: touches withEvent: event]; 
    } 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    // If not dragging, send event to next responder 
    if(!self.dragging) 
    { 
     [self.nextResponder touchesBegan: touches withEvent:event]; 
    } 
    else 
    { 
     [super touchesEnded: touches withEvent: event]; 
    } 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    // If not dragging, send event to next responder 
    if (!self.dragging) 
    { 
     [self.nextResponder touchesBegan: touches withEvent:event]; 
    } 
    else 
    { 
     [super touchesEnded: touches withEvent: event]; 
    } 
} 
+0

當然,我已經做到了。所以我說的是touchesMoved沒有被正確調用。 – user1573607

+0

嘗試關閉scrollview中的delaysContentTouches。這將立即將所有兒童接觸轉移到兒童視圖,而不檢查是否是「滾動接觸」。 – prashant

+0

沒有區別。 delaysContentTouches = YES或NO,滾動視圖的行爲是相同的。 – user1573607

0

滾動視圖屬性canCancelContentTouches = NO允許觸摸事件傳遞了響應鏈。

0

其實,這真是相當的問題,作爲的UIScrollView確實TouchesMoved事件(即使傳播幾個第一批)。

所以,我剛剛想出了直接從UIWindow獲取事件的方法。這當然不是應用程序結構意義上的最佳方法,但在某些自定義情況下(這正是我需要的)很好。

(示例在MonoTouch C#)。

創建定製的UIWindow(我這裏不顯示如何更換標準的UIWindow與mywindow的,由於我的自定義邏輯(使用MvvmCross框架),但是這很容易,通常的appDelegate初始化邏輯做 - 你會發現在谷歌/堆棧溢出):

​​

和處理事件認購自定義事件處理程序的地方:

var window = (MyWindow) UIApplication.SharedApplication.KeyWindow; 
window.OnTouchBegan += view_OnTouchBegan; 
window.OnTouchMoved += view_OnTouchMoved; 
window.OnTouchCancel += view_OnTouchCancel; 
window.OnTouchEnd += view_OnTouchEnd; 

個處理程序一樣(這就是全部由您自己):

void view_OnTouchBegan(object sender, TouchCommandArgs args) 
{ 
    // do your logic 
} 

在這種情況下,事件將被同時處理(在兩個地方:你和UIScrollView的),所以另外,如果你願意,你可以取消窗口的事件傳播只有當你想阻止任何其他處理程序應用除你的(你可以添加「Handled」標誌給你的處理程序)。

0

嘗試使用UIScrollViewDelegate跟蹤偏移更改或縮放比例更改。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView; 
- (void)scrollViewDidZoom:(UIScrollView *)scrollView; 

或檢查touchesBegan: & (touchesMoved: or touchesCancelled:) events之間的UIScrollViewzoomScale值的變化。