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).
No need of any tap gesture. Simply use UIAlertActionStyleCancel action.
in iOS7 I add dismissWithClickedButtonIndex
msg in gestureRecognizerShouldBegin
, and it works.
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.
it may be useful to you Use:
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated
previous so question
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.
Use showFromRect, for example:
UIView *barButtonView = [barButtonItem valueForKey:@"view"];
CGRect buttonRect = barButtonView.frame;
[actionSheet showFromRect:buttonRect inView:self.view animated:YES];