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).
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
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];
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.
No need of any tap gesture. Simply use UIAlertActionStyleCancel action.
You can't do that by tapping outside because action sheet covers whole view some transparent black view with buttons in form of sheet in iphones but in ipad this behavior presents by default .
so for touching outside you cant call touch methods. so i don't think so you can do in this way and also when apple provide a cancel button in action sheet then why not you do use that button rather than this.
This does not answer the question exactly, but here is what I do to close the picker when clicking on one of its items (this prevents from adding additional "done" button or "outside click" stuff):
Implement the viewForRow
picker's delegate method in which you create a UILabel and return it:
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
On those custom row labels, add a tap action handler:
UITapGestureRecognizer *tapAction = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleClick:)];
[label addGestureRecognizer:tapAction];
In the handleClick
callback, dismiss the open sheet (the one that contains the picker view):
[pickerSheet dismissWithClickedButtonIndex:0 animated:TRUE];
Use showFromRect, for example:
UIView *barButtonView = [barButtonItem valueForKey:@"view"];
CGRect buttonRect = barButtonView.frame;
[actionSheet showFromRect:buttonRect inView:self.view animated:YES];
in iOS7 I add dismissWithClickedButtonIndex
msg in gestureRecognizerShouldBegin
, and it works.
Use .cancel UIAlertActionStyle as an option.
Just add an alert with style: .cancel. Rest of the work will be done automatically.
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
精彩评论