Ios 在窗口之间传递触摸?

Ios 在窗口之间传递触摸?,ios,uiview,touch,uiwindow,Ios,Uiview,Touch,Uiwindow,我有两扇窗户,一扇前窗,一扇后窗。前一个用来在后一个上面覆盖一些东西。我希望能够捕捉前窗某些部分的触摸,但不能捕捉其他部分;我希望前窗在某些区域接受触摸,但在其他区域将其传递到后窗 有什么想法吗?好的,我做的是:我在前窗口创建了两个视图。第一个视图覆盖了我想要捕捉触摸的区域;第二个,我想让触球通过。我对UIWindow进行了子分类,并重写了hitTest:withEvent方法,如下所示: - (UIView *) hitTest:(CGPoint)point withEvent:(UIEven

我有两扇窗户,一扇前窗,一扇后窗。前一个用来在后一个上面覆盖一些东西。我希望能够捕捉前窗某些部分的触摸,但不能捕捉其他部分;我希望前窗在某些区域接受触摸,但在其他区域将其传递到后窗


有什么想法吗?

好的,我做的是:我在前窗口创建了两个视图。第一个视图覆盖了我想要捕捉触摸的区域;第二个,我想让触球通过。我对UIWindow进行了子分类,并重写了hitTest:withEvent方法,如下所示:

- (UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event {

  // See if the hit is anywhere in our view hierarchy
  UIView *hitTestResult = [super hitTest:point withEvent:event];

  // ABKSlideupHostOverlay view covers the pass-through touch area.  It's recognized
  // by class, here, because the window doesn't have a pointer to the actual view object.
  if ([hitTestResult isKindOfClass:[ABKSlideupHostOverlayView class]]) {

    // Returning nil means this window's hierachy doesn't handle this event. Consequently,
    // the event will be passed to the host window.
    return nil;
  }

  return hitTestResult;
}
在创建前窗口的课程中,我使用手势识别器捕捉第一个视图上的触摸


2017年相同代码:

class PassView: UIView {}

class UIHigherWindow: UIWindow {

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {

        let hitView = super.hitTest(point, with: event)

        if hitView!.isKind(of: PassView.self) {

            return nil
        }

        return hitView
    }
}
你的“uber”窗口将是一些视图控制器UberVc

只需将UberVc的主视图(即简单的background.view)设置为PassView

然后在UberVc上添加说按钮等


上述代码会导致任何点击进入UberVc的按钮,以及任何不点击进入常规窗口/VCs的按钮(即“背景”)的点击。

与其使用多个UIWindows,不如使用获取关键窗口,然后将视图添加到其中:

mainWindow = [[UIApplication sharedApplication] keyWindow];
[mainWindow addSubview:view]

我有一个类似的问题:额外的UIWindow应该有一个透明的视图,其中包含一些难以处理的子视图。这些难以处理的视图之外的所有接触都必须通过

我最终使用了Anna代码的修改版本,它使用view的标记而不是类型检查。这样,不需要创建视图子类:

class PassTroughWindow: UIWindow {
    var passTroughTag: Int?

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {

        let hitView = super.hitTest(point, with: event)

        if let passTroughTag = passTroughTag {
            if passTroughTag == hitView?.tag {
                return nil
            }
        }
        return hitView
    }
}
假设您创建了一个窗口和根视图控制器,您可以这样使用它:

let window: PassTroughWindow 
//Create or obtain window

let passTroughTag = 42

window.rootViewController.view.tag = passTroughTag
window.passTroughTag = passTroughTag

//Or with a view:
let untouchableView: UIView // Create it
untouchableView.tag = passTroughTag
window.addSubview(untouchableView)

为什么要使用2个窗口?它是SDK的一部分,显示在主机应用程序的覆盖层上--我们无法触及主机应用程序的视图层次结构。你有没有找到实现这一点的方法?如果是这样,即使你没有时间写一个完整的答案,你能不能至少给我们一个提示,告诉我们你该走哪条路?我试过了,但它并不适用于所有情况:一个弹出框可以出现在你的视图上。如果它是一个在底部窗口上有文本字段的web视图,你的解决方案有效吗?当你按下键盘上的“完成”按钮时?不知道——答案是三年前的。它没有:\,这就是为什么我想看看是否有人发现了它:PSpectual,Anna。我输入了一些最新的swift代码;当然,您可以随意编辑/展开等。。。干杯,谢谢!!!悬赏在途中,寻求惊人的答案!