Search code examples
iphoneobjective-cuiactionsheet

How to make a uiactionsheet dismiss when you tap outside eg above it?


How do i make a uiactionsheet dismiss when you tap outside eg above it? This is for iPhone. Apparently the ipad does this by default (I may be wrong).


Solution

  • Ok got a solution. The following applies to a subclass of a UIActionSheet

    // For detecting taps outside of the alert view
    -(void)tapOut:(UIGestureRecognizer *)gestureRecognizer {
        CGPoint p = [gestureRecognizer locationInView:self];
        if (p.y < 0) { // They tapped outside
            [self dismissWithClickedButtonIndex:0 animated:YES];
        }
    }
    
    -(void) showFromTabBar:(UITabBar *)view {
        [super showFromTabBar:view];
    
        // Capture taps outside the bounds of this alert view
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOut:)];
        tap.cancelsTouchesInView = NO; // So that legit taps on the table bubble up to the tableview
        [self.superview addGestureRecognizer:tap];
        [tap release];
    }
    

    The gist of it is to add a gesture recogniser to the action sheet's superview, and test all taps to see if they are above the action sheet.