touchesBeganユーザーが,メソッドで押し下げてから指を離したときに、「タッチアップインサイド」応答を実装する方法を誰かが知っているかどうか疑問に思っていtouchesEndedます。これは で実行できることはわかっていますが UITapGestureRecognizer、実際には、クイック タップでのみ機能するようにしようとしていUITapGestureRecognizerます ( では、指を長く押したまま離しても実行されます)。これを実装する方法を知っている人はいますか?
6 に答える
( 、、など)のすべての機能を模倣するには、を使用するUILongPressGesturizer方が実際にははるかに優れたソリューションです。UIButtontouchUpInsidetouchUpOutsidetouchDown
- (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変数をNOafter に設定します。