How to cancel a sequence of UITouch events?

2019-01-25 03:27发布

I have a UIImage view that responds to touch events. I want to cancel the touch sequence, i.e., further calls to touchesMoved:, if the touch goes outside of certain bounds. How can I do that?

I know that in touchesMoved: I can inspect the coordinates of the touch object and ignore it, but what I don't know is how to cancel the sequence altogether. I don't see any method documented in the Apple Developer UIResponder Reference that I can call to cancel a touch sequence.

12条回答
疯言疯语
2楼-- · 2019-01-25 04:14

Try temporary setting the UIImageView's userInteractionEnabled property to NO

查看更多
smile是对你的礼貌
3楼-- · 2019-01-25 04:15

This solution may be a bit kludgy, but you could implement and manually call

- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

I am basing this solution loosely on some tweaking I did to the MoveMe sample app on Apple's iPhone sample code site where I modified the touchesMoved method to look like this:

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
     UITouch *touch = [touches anyObject];
     if ([touch view] == placardView)
         CGPoint location = [touch locationInView:self];
         placardView.center = location;
         // I added the following line:
         [self touchesCancelled:touches withEvent:event];
         return;
}
查看更多
孤傲高冷的网名
4楼-- · 2019-01-25 04:15

"Brute force" solution depending if it suits your needs: Remove and re-initialize the subview that receives the touches or responds to them (of course take care of frame and content).

查看更多
成全新的幸福
5楼-- · 2019-01-25 04:16

I was just trying to solve something like this, and found that none of the solutions listed her worked for me. The best i could manage was temporarily ignoring the touches, but then they resumed when the touch re-entered the view.

Finally solved it.

  1. Set up a boolean flag called "disabled"
  2. In touchedMoved, first check that the touch is inside the desired view. If it isn't, set the disabled flag to YES.
  3. Still in in touchedMoved, check the flag before performing your action. So, at this point, nothing will happen if they're outside the view.
  4. In touchesEnded, set the disabled flag to NO. So the touch sequence is effectively halted until user lifts their finger.

I guess this will work for you unless you have a specific reason for literally needing the touch sequence cancelled.

查看更多
我想做一个坏孩纸
6楼-- · 2019-01-25 04:17

This code will help you. I disable touch event in touchesMoved: method and I am enabling touch event in touchesCancelled: method

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
     UITouch *touch = [touches anyObject];
     .......
     .......
     Your code
     .......
     .......

     //Condition when you want to disable touch event

     [[UIApplication sharedApplication] beginIgnoringInteractionEvents];

     .......
     .......
     Your code
     .......
     .......
 }


- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [[UIApplication sharedApplication] endIgnoringInteractionEvents];
}
查看更多
SAY GOODBYE
7楼-- · 2019-01-25 04:18

You may create category to UITouch. You can to declare

@property (nonatomic,strong,readwrite) UIView *view;

And when you change touch.view to nil, for example, you can simulate end of dispatching touch events

查看更多
登录 后发表回答