禁用窗口交互iOS

时间:2014-10-28 17:34:39

标签: ios uiwindow

我在屏幕上有两个UIWindows,一个在另一个后面。 有没有办法处理用户触摸后面的窗口?

由于

4 个答案:

答案 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将会收到活动。

相关问题