Dismiss a view when a user taps anywhere outside the view

A easy is to add a transparent button which bounds is equal the superview's bounds. And the superview insert the transparent button below your helper view.

The transparent button add a click event which can dismiss the helper view and the transparent button it self.

For example :

UIButton *transparencyButton = [[UIButton alloc] initWithFrame:superview.bounds];
transparencyButton.backgroundColor = [UIColor clearColor];
[superview insertSubview:transparencyButton belowSubview:helperView];
[transparencyButton addTarget:self action:@selector(dismissHelper:) forControlEvents:UIControlEventTouchUpInside];

and the dismissHelper: method can do this :

- (void)dismissHelper:(UIButton *)sender
{
    [helperView dismiss];
    sender.hidden = YES;
    // or [sender removeFromSuperview]
}

You can check the view being touched by going through the touches and looking at the .view property of the touch. It reflects the view from where the view actually originates.

Assuming that you keep a reference to your view (either via an IBOutlet or otherwise) to your view called "myView" the below works.

In your .m file. The touchesBegan: function is triggered every time the user touches a finger down. We loop through the touches to see if the originating view of the touch is NOT equal to "myView". This comparison could also be done via checking the class, tag or any other property you use to identify your view. Examples given below.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  {
    NSLog(@"touches began");
    UITouch *touch = [touches anyObject];   
    if(touch.view!=myView){
       myView.hidden = YES;
    }
}

Or in case of using a tag:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  {
    NSLog(@"touches began");
    UITouch *touch = [touches anyObject];   
    if(touch.view.tag!=23){
       myView.hidden = YES;
    }
}