我想知道当用户按下然后用touchesBegan
,touchesEnded
方法抬起手指时,是否有人知道如何实现“内部修饰”响应。我知道这可以通过UITapGestureRecognizer
来完成,但实际上我正在尝试将其设置为仅在快速点击时使用UITapGestureRecognizer
,如果您长时间握住手指,然后举起,它仍然执行)。有谁知道如何实现这个?
答案 0 :(得分:4)
使用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];
}
}
}
}
答案 1 :(得分:2)
您可以通过创建UIView子类并在那里实现来实现touchesBegan和touchesEnded。
但是,您也可以使用UILongPressGestureRecognizer并获得相同的结果。
答案 2 :(得分:2)
我通过放置一个在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])
{
}
}
答案 3 :(得分:1)
我不确定何时添加该属性,但是属性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
}
}
答案 4 :(得分:0)
您可以在BOOL
中创建一些-touchesBegan
变量,查看您需要触摸的视图或其他内容,并将此BOOL
变量设置为YES
。在-touchesEnded
之后,检查此变量是否为YES
,并且您的视图或您需要的任何内容都会被触及-touchUpInside
。当然,在{。}之后将BOOL
变量设置为NO
。
答案 5 :(得分:0)
您可以添加UTapGestureRecognizer
和UILongPressGestureRecognizer
并使用[tap requiresGestureRecognizerToFail:longPress];
添加相关性(点击并长按是添加的识别器的对象)。
这样,如果长按,则不会检测到水龙头。