jowie
jowie

Reputation: 8068

How can I remove a UIView by the user tapping or swiping anywhere else?

I've created a mini pop-up menu for the iPhone in a UIView, and I'd like the user to be able to dismiss the view if they do anything other than select one of the options. So, if a user taps/swipes/pinches any other element on the screen, the pop-up view should disappear.

However, I don't want to detect a gesture that will stop something else from happening... For example, there is a UITableView underneath and if I swipe up or down on it, I want it to move as expected as well as dismissing the mini pop-up view.

Should I use multiple gesture recognizers, or should I use touchesBegan, or is there a better way of doing it?

Upvotes: 0

Views: 2434

Answers (1)

AppyMike
AppyMike

Reputation: 2064

Put this in your UIViewController

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    if (touch.view!=yourView && yourView) {
        [yourView removeFromSuperview];
        yourView=nil;
    }

}

EDIT: changes made to detect touch and remove only if view exists

EDIT2: Well you could add the following to your UIButtons/UITableView methods

 if (yourView) {
     [yourView removeFromSuperview];
     yourView=nil;
    }  

or add touchesBegan:withEvent: as a touchDown event to your buttons.

Both annoying to do but can't see another way to do it as the touchesBegan method doesn't get called with interactive elements.

EDIT3: Right scrap that, think i've nailed it

in your interface add the UIGestureRecognizerDelegate

@interface ViewController : UIViewController <UIGestureRecognizerDelegate> {

then in your viewDidLoad add this

UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapMethod)];
tapped.delegate=self;
tapped.numberOfTapsRequired = 1;
[self.view addGestureRecognizer:tapped];

then in your viewController add these 2 methods

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

-(void)tapMethod {
[yourView removeFromSuperview];
yourView=nil;
}

Upvotes: 2

Related Questions