touchesBegan
ユーザーが,メソッドで押し下げてから指を離したときに、「タッチアップインサイド」応答を実装する方法を誰かが知っているかどうか疑問に思っていtouchesEnded
ます。これは で実行できることはわかっていますが UITapGestureRecognizer
、実際には、クイック タップでのみ機能するようにしようとしていUITapGestureRecognizer
ます ( では、指を長く押したまま離しても実行されます)。これを実装する方法を知っている人はいますか?
6 に答える
( 、、など)のすべての機能を模倣するには、を使用するUILongPressGesturizer
方が実際にははるかに優れたソリューションです。UIButton
touchUpInside
touchUpOutside
touchDown
- (void) longPress:(UILongPressGestureRecognizer *)longPressGestureRecognizer
{
if (longPressGestureRecognizer.state == UIGestureRecognizerStateBegan || longPressGestureRecognizer.state == UIGestureRecognizerStateChanged)
{
CGPoint touchedPoint = [longPressGestureRecognizer locationInView: self];
if (CGRectContainsPoint(self.bounds, touchedPoint))
{
[self addHighlights];
}
else
{
[self removeHighlights];
}
}
else if (longPressGestureRecognizer.state == UIGestureRecognizerStateEnded)
{
if (self.highlightView.superview)
{
[self removeHighlights];
}
CGPoint touchedPoint = [longPressGestureRecognizer locationInView: self];
if (CGRectContainsPoint(self.bounds, touchedPoint))
{
if ([self.delegate respondsToSelector:@selector(buttonViewDidTouchUpInside:)])
{
[self.delegate buttonViewDidTouchUpInside:self];
}
}
}
}
touchesBegan でトリガーされるタイマーを配置することでこれを行いました。touchesEnded が呼び出されたときにこのタイマーがまだ実行されている場合は、必要なコードを実行します。これにより、touchUpInside の効果が得られます。
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSTimer *tapTimer = [[NSTimer scheduledTimerWithTimeInterval:.15 invocation:nil repeats:NO] retain];
self.tapTimer = tapTimer;
[tapTimer release];
}
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
if ([self.tapTimer isValid])
{
}
}
UIView サブクラスを作成してそこに実装することで、touchesBegan と touchesEnded を実装できます。
ただし、UILongPressGestureRecognizerを使用して同じ結果を得ることもできます。
aUTapGestureRecognizer
と aUILongPressGestureRecognizer
を追加し、依存関係を追加できます[tap requiresGestureRecognizerToFail:longPress];
(タップと長押しは、追加された認識エンジンのオブジェクトです)。
これにより、長押ししてもタップが検出されなくなります。
BOOL
いくつかの変数を作成してから、-touchesBegan
どのビューまたは必要なものが触れられたかを確認し、このBOOL
変数を に設定できますYES
。その後、-touchesEnded
この変数がYES
あなたのビューまたは必要なものに触れられているかどうかを確認してください-touchUpInside
。もちろん、BOOL
変数をNO
after に設定します。