如何在整个屏幕上创建一个透明的覆盖层,包括活动键盘?

5
我已经能够通过以下代码,在所有其他视图(包括键盘)上方放置一个半透明视图,来给屏幕着色:

我已经能够通过以下代码,在所有其他视图(包括键盘)上方放置一个半透明视图,来给屏幕着色:

int count = [[[UIApplication sharedApplication]windows]count];
[[[UIApplication sharedApplication] windows] objectAtIndex:count-1]addSubview:tintView];

现在我遇到了一个问题。我的应用程序使用MessageUI.framework来显示MFMessageComposeViewController,让用户发送短信。这就是我遇到问题的地方。
当我在此情况下执行上述代码时(当消息视图正在显示时),它可以正常工作。问题是,用户不能再与其下面的消息视图进行交互。我已经在我的tintView上将userinteractionenabled设置为NO,但在这种情况下,它无法解决问题。
将tint view的hidden属性设置为YES,可以允许交互。通过更改此属性,某些东西可以使消息视图被交互。显然,我希望tintView可见。
我在最顶层的UIWindow中记录了视图,并发现UIRemoteView(我找不到任何关于它的信息,但似乎是显示MessageUI.framework视图的内容)是在tintView在其上方时没有接收到触摸的视图。
如何允许在另一个UIView显示在其上方时与MFMessageComposeViewController进行交互?在这种情况下,userinteractionenabled无法工作,但将视图设置为hidden(这不是我想要的)可以。

1
你尝试过 [tintView becomeFirstResponder]; 吗? - Scar
1
我希望tintView忽略用户输入并允许其下方的视图处理它们。这个方法很好,但当我尝试使用MessageUI.framework时出现问题。所以,不,我没有尝试过那样做,因为我不想让tintView响应输入。但是,我尝试了“[tintView resignFirstResponder]”和“[[[[[[UIApplication sharedApplication] windows]objectAtIndex:0]subviews]objectAtIndex:0]becomeFirstResponder]”。 - jadengeller
有任何进展吗?我仍然看到这个问题。 - NSProgrammer
如果 tintView 是可见的,你就不能在它下面的视图上执行任何操作。 - Himanshu Joshi
1个回答

6

我认为你可以在你的色调视图中重写 -hitTest: 方法并返回 nil

但是:将子视图插入到你没有"拥有"的窗口似乎是不好的做法...最好为此创建自己的窗口。我能问一下你为什么要给键盘着色吗?

编辑:

我编写了一些代码来演示这个方法的工作方式:

https://gist.github.com/3139219

编辑2:这对于只有一个键盘的情况有效,但对于模态视图控制器则无效,所以需要重新考虑...抱歉!


重写UIView上的hitTest并不能解决问题。了解将视图设置为隐藏除了不绘制它之外还有什么作用会很有用,因为将其设置为隐藏确实可以解决问题(但它是不可见的)。 - jadengeller
1
你可以创建一个窗口 - 它们的工作方式大多类似于视图:[[UIWindow alloc] initWithFrame:<frame>],但我认为这是不被鼓励的... 但对于你的情况也许可以。 (我以前为帮助弹出窗口做过这样的事情) - nielsbot
抱歉,我的意思是你应该重写 -[CALayer hitTest:] 而不是 -[UIView hitTest:withEvent:](这意味着你需要在你的色调视图中重写 +layerClass。你也可以尝试重写 -[CALayer containsPoint:]... 如果这些方法都不起作用,我就不确定了... - nielsbot
1
另外一个想法——确保你的窗口不要成为关键窗口...(即,要显示它,请使用setHidden:NO,而不是-makeKeyAndVisible)。 - nielsbot
很抱歉再次询问,您是只想改变键盘的颜色还是整个视图都要改变? - Anindya Sengupta
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接