Shi*_*zam 24 iphone objective-c gesture-recognition uigesturerecognizer
您将如何设置手势识别器,以便您可以同时使用UISwipeGestureRecognizer和UIPanGestureRecognizer?这样,如果您快速触摸并快速移动(快速滑动),它会将手势检测为滑动,但如果您触摸然后移动(触摸和移动之间的短暂延迟),它会将其检测为平移?
我已经尝试了requireGestureRecognizerToFail的各种排列,并且没有完全帮助,它使得如果离开SwipeGesture然后我的平移手势将向上,向下和向右工作但是滑动手势检测到任何左移动.
小智 51
您将要将两个UIGestureRecognizer代理中的一个设置为有意义的对象(可能self)然后侦听,并返回YES此方法:
- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:
(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
Run Code Online (Sandbox Code Playgroud)
当通过任一手势识别手势gestureRecognizer或者otherGestureRecognizer阻止其他手势识别器识别其手势时,调用该方法.请注意,YES保证返回可以同时识别; NO另一方面,返回不能保证防止同时识别,因为另一个手势识别器的代表可能会返回YES.
默认情况下,当用户尝试滑动时,该手势将解释为平移。这是因为滑动手势在满足将被解释为挥动(离散手势)的必要条件之前,已经满足了将其解释为摇摄(连续手势)的必要条件。
您需要通过调用要延迟的手势识别器上的requireGestureRecognizerToFail:方法来指示两个手势识别器之间的关系
[self.panRecognizer requireGestureRecognizerToFail:self.swipeRecognizer];
Run Code Online (Sandbox Code Playgroud)
- (void)setupRecognizer
{
UIPanGestureRecognizer* panSwipeRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanSwipe:)];
// Here you can customize for example the minimum and maximum number of fingers required
panSwipeRecognizer.minimumNumberOfTouches = 2;
[targetView addGestureRecognizer:panSwipeRecognizer];
}
#define SWIPE_UP_THRESHOLD -1000.0f
#define SWIPE_DOWN_THRESHOLD 1000.0f
#define SWIPE_LEFT_THRESHOLD -1000.0f
#define SWIPE_RIGHT_THRESHOLD 1000.0f
- (void)handlePanSwipe:(UIPanGestureRecognizer*)recognizer
{
// Get the translation in the view
CGPoint t = [recognizer translationInView:recognizer.view];
[recognizer setTranslation:CGPointZero inView:recognizer.view];
// TODO: Here, you should translate your target view using this translation
someView.center = CGPointMake(someView.center.x + t.x, someView.center.y + t.y);
// But also, detect the swipe gesture
if (recognizer.state == UIGestureRecognizerStateEnded)
{
CGPoint vel = [recognizer velocityInView:recognizer.view];
if (vel.x < SWIPE_LEFT_THRESHOLD)
{
// TODO: Detected a swipe to the left
}
else if (vel.x > SWIPE_RIGHT_THRESHOLD)
{
// TODO: Detected a swipe to the right
}
else if (vel.y < SWIPE_UP_THRESHOLD)
{
// TODO: Detected a swipe up
}
else if (vel.y > SWIPE_DOWN_THRESHOLD)
{
// TODO: Detected a swipe down
}
else
{
// TODO:
// Here, the user lifted the finger/fingers but didn't swipe.
// If you need you can implement a snapping behaviour, where based on the location of your targetView,
// you focus back on the targetView or on some next view.
// It's your call
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14347 次 |
| 最近记录: |