Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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).

like image 717
Chris Avatar asked May 30 '11 04:05

Chris


5 Answers

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.

like image 52
Chris Avatar answered Nov 09 '22 16:11

Chris


it may be useful to you Use:

- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated

previous so question

like image 25
Aravindhan Avatar answered Nov 09 '22 16:11

Aravindhan


After setting the cancelButtonIndex property of UIActionSheet with a valid value, tapping outside will dismiss the UIActionSheet. I have tried in iOS 9. However, if this cancelButtonIndex is not set of set to a wrong value (e.g. an index beyond the total button count in the UIActionSheet), nothing will happen when tapping outside.

like image 45
Jiaru Avatar answered Nov 09 '22 14:11

Jiaru


I think you are looking for this method

- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated

EDIT

you can use this on your action sheet object and it works just fine but you cannot register event outside that sheet like the grayed out part

may be if you use UITapGestureRecognizer on your view controller than it might do the trick.

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(nothing)];
[actionSheet addGestureRecognizer:recognizer];
like image 41
Robin Avatar answered Nov 09 '22 16:11

Robin


No need of any tap gesture. Simply use UIAlertActionStyleCancel action.

like image 1
Rohit Sunny Avatar answered Nov 09 '22 15:11

Rohit Sunny