10

我想一键关闭 UIAlertView 之外的任何地方。我想显示一个没有任何按钮的 UIAlertView。

我在这里有标准的 UIAlertView 代码,但如果可能的话,我需要输入如何关闭它。

使用 UITouch?使用 UITapGestureRecognizer?

谢谢你。


编辑:

在 viewDidLoad

alertview 在此处初始化,名称为“alert”

     if (alert)
     {
    emptyview = [[UIView alloc]initWithFrame:CGRectMake(0,0,320,480)];
    emptyview.backgroundColor = [UIColor clearColor];
    [self.view addSubview:emptyview];
         [emptyview addSubview:alert];
    NSLog (@"emptyview is there!");

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

但是这个 emptyview 根本没有响应,也没有响应 handleSingleTap 选择器,我重写了一点:

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
    [alert dismissWithClickedButtonIndex:0 animated:YES];
    [emptyview removeFromSuperview];
}

我需要这个空视图在显示警报时处于警报状态,然后我可以一键解除警报。

我试过了:

     if (alert)
     {
    emptyview = [[UIView alloc]initWithFrame:CGRectMake(0,0,320,480)];
    emptyview.backgroundColor = [UIColor clearColor];
    [self.view addSubview:emptyview];
         [emptyview addSubview:alert];
    NSLog (@"emptyview is there!");

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

当然,alert 确实响应了 handleSingleTap 函数。我对空视图做错了什么?


第二次编辑:

在这种情况下,我想要实现的是在选择一个单词后显示一个带有解释的小视图,如果你有的话,Kindle 应用程序中的类似功能。也许我应该创建一个 UIView 而不是 UIAlertView?但是 Kindle 应用中的小视图很好看,下面有阴影,怎么可能?

4

2 回答 2

10

听起来您实际上是在尝试在 iOS 上重新创建“Toast”。好消息,已经有人这样做了。看到这个项目。

编辑:不想使用 iToast。我喜欢你的风格,代码少。这是我想出的。正如其他人所说,克服模态特性的唯一方法似乎很明显,UIAlertView就是添加一个超级视图来处理触摸事件。但是您不必每次都手动执行此操作,请考虑 subclassing UIAlertView。尝试这样的事情:

编辑: @wagashi,感谢您接受我的回答,并感谢您提醒我这setFrame:是一个调整大小的好地方。您的代码确实发出了一个非常类似于吐司的小警报,但是当我尝试它时,我发现如果消息太长,视图似乎会崩溃。所以我已经修改setFrame:为简单地将警报的大小减小大约一个按钮的大小,并保持在屏幕的中心。这样该课程才能准确地回答问题标题“iOS 如何在任何地方一键关闭 UIAlertView?”

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

使用这个简单UIAlertView的子类及其UIView作为封面的子类,您可以像使用标准UIAlertView. 像这样:

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];

将产生:

自定义警报视图

于 2011-11-24T21:44:50.073 回答
3

显示 UIAlertView 后,将全屏大小的新空 UIView 添加到您的视图控制器(甚至窗口)。附加到这个视图 UITapGestureRecognizer

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

现在在handleSingleTap方法中,您可以关闭 UIAlertView 并从窗口中删除此视图

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
    [myAlert dismissWithClickedButtonIndex:0 animated:YES];
    [view removeFromSuperView];
}
于 2011-11-24T17:50:45.807 回答