我不知道是否有人知道如何当用户按下然后抬起他们的手指在touchesBegan
,touchesEnded
方法实施“润色内”的响应。我知道这可以用UITapGestureRecognizer
来完成,但实际上我试图让这个它仅适用于快速水龙头(与UITapGestureRecognizer
,如果你有握住你的手指很长一段时间,然后抬起,它仍然执行)。任何人都知道如何实现这一点?
使用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
。
您可以添加一个UTapGestureRecognizer
和UILongPressGestureRecognizer
和使用[tap requiresGestureRecognizerToFail:longPress];
(点击并长按是增加识别的对象)添加依赖。
这样一来,水龙头也不会,如果长按了发射检测。