原因 - (void)cancelTrackingWithEvent:(UIEvent *)事件被调用如果我正在使用MSSlideNavigationController?

时间:2014-01-23 04:47:42

标签: ios uicontrol

我尝试在视图控制器中使用自定义UIControl。我的自定义类,它是UIControl的子类,并为我的自定义控件分配实例,并通过以下代码添加到我的视图控制器视图中

 CustomControl *customControl = [[CustomControl alloc]initWithFrame:CGRectMake(44, 388, 235, 160)];
 [self.view addSubview:customControl];

然后我在CustomControl

中实现以下委托方法
- (BOOL) beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event;
- (BOOL) continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event;
- (void) endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)cancelTrackingWithEvent:(UIEvent *)event

我面临的问题是当我在控件内部进行跟踪时 - (void)cancelTrackingWithEvent:(UIEvent *)event在调用- (BOOL) continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event方法后调用- (void)cancelTrackingWithEvent:(UIEvent *)event。那么为什么这个方法- (BOOL) beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{ [super beginTrackingWithTouch:touch withEvent:event]; NSLog(@"Touch begins"); return YES; } - (BOOL) continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{ [super continueTrackingWithTouch:touch withEvent:event]; NSLog(@"Touch continous"); return YES; } - (void) endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{ [super endTrackingWithTouch:touch withEvent:event]; NSLog(@"Touch ends"); } - (void)cancelTrackingWithEvent:(UIEvent *)event { NSLog(@"Touch cancelled due to remove from window"); } 被调用......

我阅读的文件说,如果因非事件原因而被取消,则事件可能为零,例如从窗口中删除但无法理解确切的scernario 提前谢谢。

我始终只返回我实施的代表是:

{{1}}

3 个答案:

答案 0 :(得分:2)

我发现了问题。我使用MSSlideNavigationController覆盖 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

因此,当我跟踪时,触摸传递给MSSlideNavigationController。为了解决这个问题,我改变了(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch' in MSSlideNavigationController`类,当跟踪来自我的CustomUIControl时返回NO。我将标签9999设置为我的customcontrol

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {

    if (touch.view.tag == 9999) {
        return NO;
    }
    return YES;
}

答案 1 :(得分:2)

也许这会有所帮助。 我曾经查过UISlider的头文件,发现它使用了这种方法。

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;

  

描述
  询问是否应允许手势识别器继续跟踪触摸事件。   子类可以覆盖此方法并使用它来阻止识别特定手势。例如,UISlider类使用此方法来防止滑动平行于滑块的行进方向并从拇指开始。   在调用此方法时,手势识别器处于UIGestureRecognizerStatePossible状态,并认为它具有移动到UIGestureRecognizerStateBegan状态所需的事件。   此方法的默认实现返回YES。

https://developer.apple.com/documentation/uikit/uiview/1622460-gesturerecognizershouldbegin?language=objc

答案 2 :(得分:0)

为了调用continueTrackingWithTouch:withEvent,我认为您需要从YESbeginTrackingWithTouch:withEvent返回continueTrackingWithTouch:withEvent。如果您未返回YES,则表示您不希望再次跟踪该触摸,并且将不再调用continueTrackingWithTouch:withEvent

调用cancelTracking...的一个原因是,如果您在跟踪触摸时返回主屏幕。