我想在一个点击之外的任何地方解雇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];
}
但是这个空视图根本没有响应,它没有响应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];
}
当然,警报确实响应了handleSingleTap功能。我对emptyview有什么不妥?
第二次编辑:
在这种情况下我想要实现的是在选择单词后显示一个小视图和解释,在Kindle应用程序中使用类似的功能,如果你有的话。 也许我应该创建一个UIView而不是UIAlertView?但是Kindle应用程序中的小视图非常好,下面有阴影,它怎么可能?
答案 0 :(得分:10)
听起来你本质上是想在iOS上重新创建一个“Toast”。好消息,有人已经这样做了。 See this project.
编辑:不想使用iToast。我喜欢你的风格,更少的代码。这是我想出来的。这似乎很明显,因为其他人已经说过,克服UIAlertView
的模态性质的唯一方法是添加一个超视图来处理触摸事件。但是您不必每次都手动执行此操作,请考虑继承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];
将屈服:
答案 1 :(得分:3)
显示UIAlertView后,添加到您的视图控制器(甚至是窗口)新的空UIView全屏尺寸。附加到此wiew 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];
}