ユーザーが画面上の UI 要素の一部を再配置できるようにする iPhone アプリを作成しています。
タップジェスチャ認識エンジンと長押しジェスチャ認識エンジンを同じ UIView に追加するにはどうすればよいですか? 長押しから指を離すと、タップジェスチャーレコグナイザーが起動します。タップ ジェスチャ レコグナイザーを一時的に無効にしたり、ユーザーが長押ししているときに起動しないようにするにはどうすればよいですか?
ありがとうございました!
ユーザーが画面上の UI 要素の一部を再配置できるようにする iPhone アプリを作成しています。
タップジェスチャ認識エンジンと長押しジェスチャ認識エンジンを同じ UIView に追加するにはどうすればよいですか? 長押しから指を離すと、タップジェスチャーレコグナイザーが起動します。タップ ジェスチャ レコグナイザーを一時的に無効にしたり、ユーザーが長押ししているときに起動しないようにするにはどうすればよいですか?
ありがとうございました!
両方のジェスチャが連携できるようにするには、次のデリゲート メソッドを実装します。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return YES;
}
長押しが優先されるようにするには、次のようにします。
[tapGesture requireGestureRecognizerToFail:longPress];
別のアプローチとして、2つの別々の認識機能を使用しないでください。両方のイベントにLongPress認識機能を使用するだけです。
次のように構成します。
UILongPressGestureRecognizer* longPress = [ [ UILongPressGestureRecognizer alloc ] initWithTarget:self.nextResponder action:@selector(longPressEvent:)];
categoryPanelDrag.minimumPressDuration = 0.0;
次に、次のように処理します。
- (BOOL)longPressEvent:(UILongPressGestureRecognizer *)gesture {
// _dragStarted is a class-level BOOL
if(UIGestureRecognizerStateBegan == gesture.state) {
_dragStarted = NO;
}
if(UIGestureRecognizerStateChanged == gesture.state) {
_dragStarted = YES;
// Do dragging stuff here
}
if(UIGestureRecognizerStateEnded == gesture.state) {
if (_dragStarted == NO)
{
// Do tap stuff here
}
else
{
// Do drag ended stuff here
}
}
return YES;
}
私はmobyとjourmanのアプローチを試しましたが、どういうわけか私のプロジェクトにうまく適合しなかったので、以下のように解決しました。
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
NSLog(@"%@ %ld",touch.description, touch.phase);
[self performSelector:@selector(checkTouch:) withObject:touch afterDelay:0.5];
return YES;
}
と
- (void)checkTouch:(UITouch *)touch{
NSLog(@"touch phase = %ld",touch.phase);
if (touch.phase == UITouchPhaseStationary) {
//still holding my hand and this means I wanted longPressTouch
}
if (touch.phase == UITouchPhaseEnded){
//I released my finger so it's obviously tap
}
}
それはより簡単な解決策かもしれませんが、もちろんそれはプロジェクトに依存します。
長押し中にフラグを設定し、フラグが true またはその他のときにタップが呼び出された場合は、タップ コードを実行せずにフラグをリセットするように、コードで処理できます。私はより良い方法を知りません