我添加了一个UIView
,其中包含UITapGestureRecognizer
作为我的关键窗口的子视图。它显示正确,但是当我点击我的视图时,不会触发目标方法。我甚至试图用UIButton
替换手势识别器,但仍无济于事。
这是我的代码。
NotificationView.h
#import <UIKit/UIKit.h>
typedef NS_ENUM(int, NotificationKind) {
NotificationKindActivity,
NotificationKindReply,
};
@interface NotificationView : UIView {
NotificationKind currentNotificationKind;
}
-(id)initWithMessage:(NSString*)message andColor:(UIColor*)color andKind:(NotificationKind)kind;
-(void)show;
@end
NotificationView.m
#import "NotificationView.h"
@implementation NotificationView
- (id)initWithMessage:(NSString*)message andColor:(UIColor*)color andKind:(NotificationKind)kind
{
self = [super initWithFrame:CGRectMake(0, 0, CGRectGetWidth([UIScreen mainScreen].bounds), 60)];
if (self) {
// Initialization code
[self setAlpha:0];
[self setBackgroundColor:color];
[self setUserInteractionEnabled:YES];
currentNotificationKind = kind;
UILabel *label = [[UILabel alloc] initWithFrame:self.bounds];
[label setNumberOfLines:0];
[label setFont:[UIFont fontWithName:@"Roboto-Italic" size:20]];
[label setTextColor:[UIColor whiteColor]];
[label setTextAlignment:NSTextAlignmentCenter];
[label setPreferredMaxLayoutWidth:290];
[label setText:message];
[label setUserInteractionEnabled:YES];
[self addSubview:label];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(notificationTapped)];
[tap setNumberOfTapsRequired:1];
[self addGestureRecognizer:tap];
[[[UIApplication sharedApplication] keyWindow] addSubview:self];
}
return self;
}
-(void)show{
[UIView animateWithDuration:0.3 animations:^{
[self setAlpha:1];
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.3 delay:3 options:UIViewAnimationOptionCurveLinear animations:^{
[self setAlpha:0];
} completion:^(BOOL finished) {
[self removeFromSuperview];
}];
}];
}
-(void)notificationTapped{
DDLogDebug(@"Notification tapped!");
}
@end
答案 0 :(得分:14)
当我遇到这种情况时,通常是因为我搞砸了UIView
帧。我看到所有内容都符合预期,因为我的UIView
没有剪切到界限,但我无法与任何东西互动,因为我的水龙头超出了UIView
的范围。
我的简单测试是更改UIView
的背景颜色,看看它是否涵盖了我期望的区域,或者我是否以某种方式搞砸了尺寸/位置。
我常常用这个问题把头撞到墙上,挣扎了好几个小时,但我已经做了很多次,现在是5分钟修复了“哦,再说一遍”。
修改强>
然后我会查看您的show
代码。你的主叫代码不在这里,但是如果我假设你只是使用你的show
代码并且你的观点仅在屏幕上显示3秒钟,那么那就是你的问题。
Justin提到(上面的评论)和Apple的文档
在动画期间,暂时禁用用户交互 动画中涉及的所有视图,无论其中的值如何 属性。您可以通过指定禁用此行为 配置时的UIViewAnimationOptionAllowUserInteraction选项 动画。
由于您的视图在屏幕上的整个时间都是动画块的一部分,因此所有交互都将在其可见的整个时间内禁用。我从来没有完全测试delay
位以及动画是否在该片段中被禁用,但是在延迟期间禁用动画并不会让我感到惊讶。第二个动画仍然在主动画块中,所以我假设动画将被阻止,直到两个动画都完成。
答案 1 :(得分:0)
根据@DBD ...
的建议更新了NotificationView.m
文件
#import "NotificationView.h"
@implementation NotificationView
- (id)initWithMessage:(NSString*)message andColor:(UIColor*)color andKind:(NotificationKind)kind
{
self = [super initWithFrame:CGRectMake(0, 0, CGRectGetWidth([UIScreen mainScreen].bounds), 60)];
if (self) {
// Initialization code
[self setAlpha:0];
[self setBackgroundColor:color];
[self setClipsToBounds:YES];
currentNotificationKind = kind;
UILabel *label = [[UILabel alloc] initWithFrame:self.bounds];
[label setNumberOfLines:0];
[label setFont:[UIFont fontWithName:@"Roboto-Italic" size:20]];
[label setTextColor:[UIColor whiteColor]];
[label setTextAlignment:NSTextAlignmentCenter];
[label setPreferredMaxLayoutWidth:290];
[label setText:message];
[self addSubview:label];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(notificationTapped)];
[tap setNumberOfTapsRequired:1];
[self addGestureRecognizer:tap];
[[[UIApplication sharedApplication] keyWindow] addSubview:self];
}
return self;
}
-(void)show{
[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
[self setAlpha:1];
} completion:nil];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
[self setAlpha:0];
} completion:^(BOOL finished) {
[self removeFromSuperview];
}];
});
}
-(void)notificationTapped{
DDLogDebug(@"Notification tapped!");
}
@end
答案 2 :(得分:0)
我最终能够创建一个全屏子视图,通过将手势添加到应用程序的keyWindow来接受手势,假设首先调用了makeKeyAndVisible:
dictRemoveWS
然后将其显示在状态栏上方:
myView.hidden = YES;
[[[UIApplication sharedApplication] keyWindow] addSubview:myView];
要改回来:
[[UIApplication sharedApplication] keyWindow].windowLevel = UIWindowLevelStatusBar + 1;
myView.hidden = NO;
这只会改变应用程序主窗口(包括其所有子视图)在窗口层次结构中的位置。希望有所帮助!