How to make a uiactionsheet dismiss when you tap o

2019-01-23 15:45发布

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

10条回答
劫难
2楼-- · 2019-01-23 16:20

Use .cancel UIAlertActionStyle as an option.

查看更多
爷、活的狠高调
3楼-- · 2019-01-23 16:24

Use showFromRect, for example:

UIView *barButtonView = [barButtonItem valueForKey:@"view"];
CGRect buttonRect = barButtonView.frame;

[actionSheet showFromRect:buttonRect inView:self.view animated:YES];
查看更多
成全新的幸福
4楼-- · 2019-01-23 16:29

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];
查看更多
祖国的老花朵
5楼-- · 2019-01-23 16:31

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.

查看更多
登录 后发表回答