【问题标题】:Reason for - (void)cancelTrackingWithEvent:(UIEvent *)event getting called If I am using MSSlideNavigationController?如果我使用 MSSlideNavigationController,调用 - (void)cancelTrackingWithEvent:(UIEvent *)event 的原因?
【发布时间】:2014-02-13 11:53:08
【问题描述】:

我尝试在我的视图控制器中使用自定义 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...

我读过文件说,//如果由于非事件原因取消事件可能为零,例如从窗口中删除但无法理解确切的场景 提前致谢。

我总是只返回YES我实现的代表是:

- (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");
}

【问题讨论】:

    标签: ios uicontrol


    【解决方案1】:

    为了调用continueTrackingWithTouch:withEvent,我认为您需要从beginTrackingWithTouch:withEventcontinueTrackingWithTouch:withEvent 返回YES。如果您不返回YES,则表示您不想再跟踪触摸,并且将不再调用continueTrackingWithTouch:withEvent

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

    【讨论】:

      【解决方案2】:

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

      所以当我跟踪时,触摸传递给MSSlideNavigationController。为了解决这个问题,我更改了(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch' inMSSlideNavigationController` 类,当跟踪来自我的CustomUIControl 时返回NO。我将标签 9999 设置为我的自定义控件

      - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
      
          if (touch.view.tag == 9999) {
              return NO;
          }
          return YES;
      }
      

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-04-15
          • 1970-01-01
          • 2021-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多