32

前面と背面の2つのウィンドウがあります。前面のものは、背面のものの上にいくつかのものをオーバーレイするために使用されます。フロントウィンドウの一部のタッチをキャプチャできるようにしたいのですが、他の部分はキャプチャできないようにします。一部の領域ではフロントウィンドウにタッチを受信させたいのですが、他の領域ではバックウィンドウにタッチを渡します。

私がこれをどのように行うかについてのアイデアはありますか?

4

3 に答える 3

43

さて、これが私がしたことです:私はフロントウィンドウに2つのビューを作成しました。最初のビューは、私がタッチをキャッチしたい領域をカバーしていました。2つ目は、タッチを通過させたかったところです。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のメインビュー(つまり、単に背景の.view)をPassViewにするだけです。

次に、UberVcにsayボタンなどを追加します。

上記のコードにより、UberVcに移動するボタンがクリックされ、ボタン以外のクリック(つまり、「背景」)が通常のウィンドウ/VCに移動します。

于 2013-05-08T23:29:52.970 に答える
2

私も同様の問題を抱えていました。追加の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)
于 2017-12-25T19:49:48.887 に答える
-4

複数のUIWindowsを使用する代わりに、でキーウィンドウを取得し、[[UIApplication sharedApplication] keyWindow]それにビューを追加します。

mainWindow = [[UIApplication sharedApplication] keyWindow];
[mainWindow addSubview:view]
于 2013-06-23T16:01:52.753 に答える