jjzjj

ios - 作为 UIWindow subview 添加的 UIView 不响应点击

coder 2023-09-24 原文

我添加了一个包含 UITapGestureRecognizerUIView 作为我的关键窗口的 subview 。它显示正确,但是当我点击我的 View 时,没有触发目标方法。我什至尝试用 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

最佳答案

当我遇到这种情况时,通常是因为我搞砸了我的 UIView 框架。我按预期看到了所有内容,因为我的 UIView 没有超出范围,但我无法与任何内容交互,因为我的点击超出了 UIView 的范围。

我的简单测试是更改 UIView 的背景颜色,看看它是否覆盖了我期望的区域,或者我是否以某种方式搞砸了大小/位置。

我过去常常为这个问题把头撞在墙上,挣扎了几个小时,但我已经做了很多次,现在只需 5 分钟就可以解决“哦,又是那个问题”。

编辑:

然后我会查看您的show 代码。您的调用代码不在这里,但如果我假设您只是在使用您的 show 代码并且您的 View 仅在屏幕上停留 3 秒,那么这就是您的问题。

正如 Justin 提到的(上面的评论)和 Apple 的文档

During an animation, user interactions are temporarily disabled for all views involved in the animation, regardless of the value in this property. You can disable this behavior by specifying the UIViewAnimationOptionAllowUserInteraction option when configuring the animation.

由于您的 View 在屏幕上的整个过程中都是动画 block 的一部分,因此在它可见的整个过程中所有交互都将被禁用。我从来没有完全测试过 delay 位以及在那段期间动画是否被禁用,但我不会对在延迟期间动画被禁用感到惊讶。第二个动画仍在主动画 block 内,所以我假设动画将被阻塞,直到两个动画都完成。

关于ios - 作为 UIWindow subview 添加的 UIView 不响应点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25365228/

有关ios - 作为 UIWindow subview 添加的 UIView 不响应点击的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

    我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

  3. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  4. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  5. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  6. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  7. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  8. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  9. ruby - 可以通过多少种方法将方法添加到 ruby​​ 对象? - 2

    当谈到运行时自省(introspection)和动态代码生成时,我认为ruby​​没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby​​的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资

  10. ruby - 如何在 Ruby 中向现有方法定义添加语句 - 2

    我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca

随机推荐