這裏是UIPanGesture子類:爲什麼我的平移手勢只會推動它的視線並停止?
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"touches began");
self ->origLoc = [[touches anyObject] locationInView:self.view.superview];
[super touchesBegan:touches withEvent:event];
}
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
if (self.state == UIGestureRecognizerStatePossible) {
CGPoint loc = [[touches anyObject] locationInView:self.view.superview];
CGFloat deltaX = fabsf(loc.x - origLoc.x);
CGFloat deltaY = fabsf(loc.y - origLoc.y);
if (deltaY >= deltaX) {
self.state = UIGestureRecognizerStateFailed;
} else {
[super touchesMoved:touches withEvent:event];
}
}
}
- (CGPoint) translationInView:(UIView *)v {
CGPoint proposedTranslation = [super translationInView:v];
proposedTranslation.y = 0;
return proposedTranslation;
}
這裏是被我的子類UIPanGesture調用的方法:
- (void)dragging: (UIPanGestureRecognizer *)p {
UIView *vv = p.view;
if (p.state == UIGestureRecognizerStateBegan || p.state == UIGestureRecognizerStateChanged) {
CGPoint delta = [p translationInView:vv.superview];
CGPoint c = vv.center;
c.x += delta.x;
c.y += delta.y;
vv.center = c;
[p setTranslation:CGPointZero inView:vv.superview];
}
}
當我試圖拖動我看來,它只是移動一個非常小的量然後停下來。我需要不斷推動它才能讓它移動。有任何想法嗎?
在此先感謝,
Michael。
danh可能正在走向正確的思路。出於好奇,你想用這個子類型的手勢識別器做什麼?如果你只是想左右搖擺,那麼解決這個問題有更簡單的方法。或者您是否還有其他一些處理垂直移動的平移手勢識別器,並且您正在嘗試檢測使用哪種手勢識別器?但是我會認爲,一旦你鎖定了一個特定的識別器,你就會停止進一步檢查滑動方向(以允許微小的手指移動進行微小的改變)。 – Rob
它是在GMGridView(UIScrollview)中的單元格上進行操作的,我只想在檢測到水平平移時向左或向右移動其中一個單元格內的內容,並在檢測到垂直平移時滾動整個視圖。你提到我應該停止檢查滑動方向,我該怎麼做? –
底線有一個變量,用於跟蹤您是否確認了是否檢查了初始動作的方向,還有另一個變量會告訴您它是否水平。然後,您可以檢查該變量是否跟蹤初始移動是否爲水平,以確定是否將狀態更改爲UIGestureRecognizerStateFailed。看到我的答案。 – Rob