Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove view when tapped outside

I have a UIView, that I have appear when a button is tapped, I am using it as a custom alert view essentially. Now when the user taps outside the custom UIView that I added to the main view, I want to hide the cusomt view, I can easily do this with customView.hidden = YES; but how can I check for the tap outside the view?

Thanks for the help

like image 373
spen123 Avatar asked Aug 21 '15 23:08

spen123


2 Answers

There are 2 approaches

First approach

You can set a tag for your custom view:

customview.tag=99;

An then in your viewcontroller, use the touchesBegan:withEvent: delegate

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];

    if(touch.view.tag!=99){
        customview.hidden=YES;
    }
}

Second approach

It's more likely that every time you want to popup a custom view, there's an overlay behind it, which will fill your screen (e.g. a black view with alpha ~0.4). In these cases, you can add an UITapGestureRecognizer to it, and add it to your view every time you want your custom view to show up. Here's an example:

UIView *overlay;

-(void)addOverlay{
        overlay = [[UIView alloc] initWithFrame:CGRectMake(0,  0,self.view.frame.size.width, self.view.frame.size.height)];
    [overlay setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]];

    UITapGestureRecognizer *overlayTap =
    [[UITapGestureRecognizer alloc] initWithTarget:self
                                        action:@selector(onOverlayTapped)];

    [overlay addGestureRecognizer:overlayTap];
    [self.view addSubview:overlay];
}

- (void)onOverlayTapped
{
    NSLog(@"Overlay tapped");
    //Animate the hide effect, you can also simply use customview.hidden=YES;
    [UIView animateWithDuration:0.2f animations:^{
        overlay.alpha=0;
        customview.alpha=0;
    }completion:^(BOOL finished) {
        [overlay removeFromSuperview];
    }];
}
like image 199
FlySoFast Avatar answered Oct 20 '22 13:10

FlySoFast


Like in the answer of FlySoFast, I tried first approach and it worked I just shared to swift version of it. You can tag it of your custom view and the check the that view touched or not so we achieved our solution I guess.In the below I assign tag value of my custom view to 900.

customview.tag = 900

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch = touches.first!
    if touch.view?.tag != 900 {
        resetMenu()
    }

}

I hope this answer will help to you

like image 32
Esat kemal Ekren Avatar answered Oct 20 '22 13:10

Esat kemal Ekren