触摸时Uibutton触摸向下操作未调用,但触摸移动时调用

OMG*_*POP 8 cocoa-touch objective-c uikit ios

当用户触摸DOWN UIButton时,您需要执行操作

[button addTarget:self action:@selector(touchDown:event:) forControlEvents:UIControlEventTouchDown];
[button addTarget:self action:@selector(drag:event:) forControlEvents:UIControlEventTouchDragInside];
[button addTarget:self action:@selector(drag:event:) forControlEvents:UIControlEventTouchDragOutside];
[button addTarget:self action:@selector(touchUp:event:) forControlEvents:UIControlEventTouchUpInside];
[button addTarget:self action:@selector(touchUp:event:) forControlEvents:UIControlEventTouchUpOutside];

- (void)touchDown:(UIButton *)sender event:(UIEvent *)event {
    //begin only called when I move my finger 
}


- (void)drag:(UIButton *)sender event:(UIEvent *)event {
    //called when I move my finger, after touchDown was called
}
- (void)touchUp:(UIButton *)sender event:(UIEvent *)event {

}
Run Code Online (Sandbox Code Playgroud)

我的应用程序的根视图控制器是tabbarviewcontroller,每个选项卡都是导航视图控制器.在聊天场景的viewWillAppear方法中,我隐藏了标签栏.

结果是,在设备上,当我触摸时,它没有被调用,当我移动我的手指时,它被调用.

注意:

  1. 使用长按手势识别器也不起作用.

  2. 如果我将按钮远离标签栏区域,它可以在设备上运行.

  3. 在模拟器上,一切都很好.

我创建了一个示例项目:https: //drive.google.com/folderview?id = 0B_9_90avvmZtRmRDeHFkbFJLaFk&usp =sharing

mac*_*rth 11

此按钮位于滚动视图内的任何位置(包括集合或tableview)吗?如果是这样,那么这正是预期的行为.系统等待您查看是否要点击按钮或拖动滚动视图.来自Apple:

因为滚动视图没有滚动条,所以它必须知道触摸是否表示滚动意图与跟踪内容中的子视图的意图.为了做出这种确定,它通过启动计时器暂时拦截触碰事件,并且在计时器触发之前,查看触摸手指是否进行任何移动.如果计时器在没有显着位置变化的情况下触发,则滚动视图将跟踪事件发送到内容视图的触摸子视图.如果用户在计时器过去之前将手指拖得足够远,则滚动视图会取消子视图中的任何跟踪并执行滚动操作.子类可以覆盖touchesShouldBegin:withEvent:inContentView:,pagingEnabled,touchesShouldCancelInContentView:方法(其由滚动视图调用)来影响滚动视图如何处理滚动手势.

如果您不想要此行为,则可以设置parentview.delaysContentTouches为" NO您可能还需要设置canCancelContentTouches为"NO


小智 9

嗨@OMGPOP我有同样的问题,现在我已经解决了它添加下面的代码:

self.navigationController.interactivePopGestureRecognizer.delaysTouchesBegan = NO;
Run Code Online (Sandbox Code Playgroud)

我确定这是你的救世主,因为我已下载你的示例代码并添加上面的代码,它工作正常.像这样:

self.navigationController.interactivePopGestureRecognizer.delaysTouchesBegan = NO;


[self.holdToRecordButton addTarget:self action:@selector(touchDown:event:) forControlEvents:UIControlEventTouchDown];
[self.holdToRecordButton addTarget:self action:@selector(drag:event:) forControlEvents:UIControlEventTouchDragInside];
[self.holdToRecordButton addTarget:self action:@selector(drag:event:) forControlEvents:UIControlEventTouchDragOutside];
[self.holdToRecordButton addTarget:self action:@selector(touchUp:event:) forControlEvents:UIControlEventTouchUpInside];
[self.holdToRecordButton addTarget:self action:@selector(touchUp:event:) forControlEvents:UIControlEventTouchUpOutside];
Run Code Online (Sandbox Code Playgroud)


nik*_*ers 0

您的按钮上有子视图吗?这些可能会拦截触摸并导致您所看到的行为。