我在屏幕上有两个UIWindows,一个在另一个后面。 有没有办法处理用户触摸后面的窗口?
由于
答案 0 :(得分:1)
您应该可以像任何UIView一样禁用它。
UIWindow *secondWindow = [[UIWindow alloc] initWithFrame:<#frame#>];
[secondWindow setUserInteractionEnabled:NO];
答案 1 :(得分:1)
谢谢,但我刚刚找到了方法:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
for (UIWindow *win in [[UIApplication sharedApplication] windows]) {
if (win.tag != self.tag) {
return [win hitTest:point withEvent:event];
}
}
return nil;
}
答案 2 :(得分:1)
默认情况下,iOS首先会触摸哪个窗口,如果触摸区域中有多个窗口,则会选择最顶层的窗口(基于窗口级别,z索引)
接下来它会在操作系统认为触及的窗口上调用hitTest(_ point: CGPoint, with event: UIEvent) -> UIView?
。
如果您在该窗口中的视图可能返回nil(在该窗口中无法触摸视图,或者您已覆盖hitTest),则窗口将自动返回。
要解决此问题,您需要继承UIWindow
并覆盖hitTest函数。如果从super.hitTest_:with:)
返回的视图为nil或self // the window
,那么您可以选择委托给另一个窗口。请注意触摸的窗口可能有另一个坐标空间,然后是您将委派给的窗口。
示例:
internal final class CustomWindow: UIWindow {
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if let view = super.hitTest(point, with: event), view != self {
return view
}
guard let keyWindow = UIApplication.shared.keyWindow else {
return nil
}
return keyWindow.hitTest(keyWindow.convert(point, from: self), with: event)
}
}
答案 3 :(得分:0)
您一次只能在一个UIWindow
上接受触摸事件。接受事件的UIWindow
称为keyWindow
。
[behindWindow makeKeyAndVisible];
您的前景UIWindow
仍然可见,但您的behindWindow
将会收到活动。