我想知道当用户按下然后在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];
}
}
}
}
您可以通过创建 UIView 子类并在那里实现它来实现 touchesBegan 和 touchesEnded。
但是,您也可以使用UILongPressGestureRecognizer并获得相同的结果。
我通过放置一个在 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])
{
}
}
我不确定它是什么时候添加的,但该属性是任何派生对象(例如)isTouchInside
的救命稻草。UIControl
UIButton
override func endTracking(_ touch: UITouch?, with event: UIEvent?) {
super.endTracking(touch, with: event)
if isTouchInside {
// Do the thing you want to do
}
}
这是苹果官方文档
您可以创建一些BOOL
变量,然后-touchesBegan
检查触摸了什么视图或您需要的任何内容,并将此BOOL
变量设置为YES
. 之后-touchesEnded
检查这个变量是否是YES
你的视图或你需要的任何东西被触及,这将是你的-touchUpInside
. 当然,将BOOL
变量设置为NO
之后。
您可以添加 aUTapGestureRecognizer
和 aUILongPressGestureRecognizer
并使用添加依赖项[tap requiresGestureRecognizerToFail:longPress];
(点击和长按是添加识别器的对象)。
这样,如果长按被触发,将不会检测到点击。