iOS How to dismiss UIAlertView with one tap anywhere?

前端 未结 2 625
有刺的猬
有刺的猬 2020-12-06 06:29

I want to dismiss UIAlertView anywhere outside it with one tap. I want to show a UIAlertView without any button.

I have standard UIAlertView codes here, but I need

相关标签:
2条回答
  • 2020-12-06 06:50

    It sounds like you are essentially trying to recreate a "Toast" on iOS. Good news, someone has already done that. See this project.

    Edit: Don't want to use iToast. I like your style, less code it is. Here is what I come up with. It would seem obvious as others have said that the only way to overcome the modal nature of the UIAlertView is to add a superview to handle touch events. But you don't have to do that manually every time, consider subclassing UIAlertView. Try something like this:

    Edit: @wagashi, Thanks for accepting my answer, and thanks for the heads up about setFrame: being a good place to adjust the size. Your code does make a very toast-like little alert, however when I tried it I found that if the message was to long the view seemed to fall apart. So I have modified setFrame: to simply reduce the size of the alert by about the size of one button, and to remain centered on the screen. So that the class accurately answers the question title "iOS How to dismiss UIAlertView with one tap anywhere?"

    NoButtonAlertView.h

    #import <UIKit/UIKit.h>
    @interface _NoButtonAlertViewCover : UIView
    @property (nonatomic,assign) UIAlertView *delegate;
    @end
    @interface NoButtonAlertView : UIAlertView
    -(id)initWithTitle:(NSString *)title message:(NSString *)message;
    @end
    

    NoButtonAlertView.m

    #import "NoButtonAlertView.h"
    @implementation _NoButtonAlertViewCover
    @synthesize delegate = _delegate;
    -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
        [self removeFromSuperview];
        [_delegate dismissWithClickedButtonIndex:0 animated:YES];
    }
    @end
    @implementation NoButtonAlertView
    -(void)show{
        [super show];
        _NoButtonAlertViewCover *cover = [[_NoButtonAlertViewCover alloc] initWithFrame:[UIScreen mainScreen].bounds];
        cover.userInteractionEnabled = YES;
        cover.backgroundColor = [[UIColor lightGrayColor] colorWithAlphaComponent:.01];
        cover.delegate = self;
        [self.superview addSubview:cover];
    }
    -(id)initWithTitle:(NSString *)title message:(NSString *)message{
        if ((self = [super initWithTitle:title message:message delegate:nil cancelButtonTitle:nil otherButtonTitles:nil, nil])){
        }
        return self;
    }
    - (void)setFrame:(CGRect)rect {
        // Called multiple times, 4 of those times count, so to reduce height by 40
        rect.size.height -= 10;
        self.center = self.superview.center;
        [super setFrame:rect];
    }
    @end
    

    With this simple UIAlertView subclass and its UIView subclass for a cover, you can use it as simply as you would a standard UIAlertView. Like so:

    NoButtonAlertView *alert = [[NoButtonAlertView alloc] initWithTitle:@"Hello" message:@"I am the very model of a modern major general; I'm information, vegitable, animal, and mineral."];
    [alert show];
    

    Will yield:

    Custom AlertView

    0 讨论(0)
  • 2020-12-06 06:53

    After showing UIAlertView add to your view controller (or even window) new empty UIView with full screen size. Attach to this wiew UITapGestureRecognizer

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    [view addGestureRecognizer:singleTap];
    [singleTap release];
    

    Now in handleSingleTap method you can dismiss UIAlertView and remove this view from window

    -(void)handleSingleTap:(UITapGestureRecognizer *)sender{
        [myAlert dismissWithClickedButtonIndex:0 animated:YES];
        [view removeFromSuperView];
    }
    
    0 讨论(0)
提交回复
热议问题