在堆叠的UIWindows之间传递触摸?

问题描述 投票:22回答:3

我有两个窗户 - 一个是前窗,另一个是后窗。前面的一个用于覆盖后面的一些东西。我希望能够捕捉前窗某些部分的触摸,而不是其他部分;我希望前窗在某些区域接收触摸,但是将它们传递到其他区域的后窗。

关于我怎么做的任何想法?

ios uiview touch uiwindow
3个回答
33
投票

好的,这就是我做的:我在前窗口创建了两个视图。第一个视图涵盖了我想要触及的区域;第二,我希望触摸通过。我对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
    }
}

你的“超级”窗口将是一些视图控制器,UberVc。

只需让UberVc的主视图(也就是说,背景.view)成为PassView。

然后在UberVc上添加说按钮等。

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


0
投票

我有一个类似的问题:额外的UIWindow应该有一个透明的视图与一些难以处理的子视图。必须通过那些难以处理的视图之外的所有接触。

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

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)

-4
投票

不要使用多个UIWindows,而是使用[[UIApplication sharedApplication] keyWindow]获取关键窗口,然后将视图添加到它:

mainWindow = [[UIApplication sharedApplication] keyWindow];
[mainWindow addSubview:view]
© www.soinside.com 2019 - 2024. All rights reserved.