長押しジェスチャでシンプルなビュー (黒い四角) を作成し、UIGestureRecognizerStateEnded をキャッチするまで画面 (UIGestureRecognizerStateChanged) にドラッグします。OK、これはうまくいきます。ここで、この黒い正方形のビューの追加のジェスチャー (UISwipeGestureRecognizer) を認識できるようにしたいと考えています。アルゴリズムは単純です。
- 長押しで黒い四角を作る
- 指が画面上に留まる
- 正方形ビューをドラッグ (setCenter:)
- スワイプして認識する UISwipeGestureRecognizer
問題は、長押しジェスチャが終了していない間、スワイプを認識できないことです (UIGestureRecognizerStateEnded)
#pragma mark - View lifecycle
- (void)loadView {
[super loadView];
// Long press
self.longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(gestureAction:)];
[self.longPressGestureRecognizer setDelegate:self];
[self.view addGestureRecognizer:self.longPressGestureRecognizer];
// Swipe
self.swipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(gestureAction:)];
[self.swipeGestureRecognizer setDelegate:self];
[self.swipeGestureRecognizer setEnabled:NO];
[self.view addGestureRecognizer:self.swipeGestureRecognizer];
}
#pragma mark - Gesture recognizer
- (void)gestureAction:(UIGestureRecognizer *)recognizer {
// Swipe
if ([recognizer isKindOfClass:NSClassFromString(@"UISwipeGestureRecognizer")]) {
NSLog(@"swipeGestureRecognizer handled!!");
}
// Long press
if ([recognizer isKindOfClass:NSClassFromString(@"UILongPressGestureRecognizer")]) {
if (recognizer.state == UIGestureRecognizerStateBegan) {
self.activeView = [[ItemView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[self.activeView setBackgroundColor:[UIColor blackColor]];
self.activeView.center = [recognizer locationInView:self.view];
[self.view addSubview:self.activeView];
}
else if (recognizer.state == UIGestureRecognizerStateChanged) {
if (![self.swipeGestureRecognizer isEnabled]) {
[self.swipeGestureRecognizer setEnabled:YES];
NSLog(@"swipeGestureRecognizer enabled");
}
self.activeView.center = [recognizer locationInView:self.view];
}
else if (recognizer.state == UIGestureRecognizerStateEnded) {
[self.swipeGestureRecognizer setEnabled:NO];
NSLog(@"swipeGestureRecognizer disabled");
[self.activeView removeFromSuperview];
self.activeView = nil;
}
}
}
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
return YES;
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
return YES;
}
PS 長押しで日付キャンバスにイベントを作成するときは、ネイティブのカレンダー アプリとまったく同じ動作が必要です。(長押しジェスチャを終了する前に) オブジェクトをスワイプすると、スムーズに消えます。