2016-07-08 7 views
1

私は再生しています。私のアプリケーションはシンプルです:ビューに触れるときの「奇妙な」動作

  1. 私はカスタムビューコントローラとそれに関連するビューを持っており、それをmainViewと呼びます。私のカスタムビューコントローラは、touchesBeganメソッドをオーバーライドします。私のtouchesBeganメソッドは、タッチされたビューにボーダーを追加し、以前にタッチされたビュー(存在する場合)からボーダーを削除します。したがって、どのビューが最後に触れられたのかを視覚的に示しています。

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    print("There are \(touches.count) touch(es)") 
    if let selectedView = self.selectedView { 
        selectedView.borderWidth = 0 
    } 
    self.selectedView = touches.first?.view 
    if let selectedView = self.selectedView { 
        selectedView.borderColor = UIColor.blackColor() 
        selectedView.borderWidth = 2 
    } 
    

    } Iは、サブビューを追加したメインビューに

  2. 、サブビューを呼び出します。

  3. 私は2つのサブビューを追加しました、それらをsubSubView1とsubSubView2と呼びます。

enter image description here

私は私が期待するよう国境が現れたり消えたり景色に触れたよう。しかし、subSubView1(またはsubSubView2)の位置を、部分的にサブビューの内側と部分的に外側に変更すると、その動作は「奇妙」になります。 subViewと重なっているsubSubView1の部分に触れると、subSubView1は境界を受け取ります。 mainViewと重なるsubSubView1の部分に触れると、境界を受け取るmainViewになります。誰かがこの行動を理解するのを助けてくれますか?

Xcode 7.3、iPhone 6 Simulatorでのデバッグ。

+0

これを試してください: 'mainView.bringSubviewToFront(touchedView)'。 'subView'に触れるときにこの行を置きます。 – Santosh

+0

ビューがその親の外側にある場合、ビューは選択できません。タッチイベントがボトムアップ(mainView)していると仮定します。その後、mainViewの子に移動します。その接触がその子供の中になければ、それは止まる。親にないサブ・サブ・ビューの部分は、その親にないタッチ・イベントを受信しません。 – Putz1103

答えて

0

ビューがその親の外側にある場合、ビューは選択できません。タッチイベントがボトムアップ(mainView)していると仮定します。その後、mainViewの子に移動します。その接触がその子供の中になければ、それは止まる。親にないサブ・サブ・ビューの部分は、その親にないタッチ・イベントを受信しません。

詳細については、this questionを参照してください。

リンクがログイン画面の背後にある場合のコピーされたテキスト。

Q:私のビューは画面に正しく表示されますが、タッチイベントは発生しません。何故ですか?

回答:この問題の最も一般的な原因は、ビューが親ビューの境界外にあるためです。アプリケーションがタッチイベントを受信すると、ヒットテストプロセスが開始され、どのビューがイベントを受け取るべきかを決定します。プロセスは、ビュー階層のルート(通常はアプリケーションのウィンドウ)から始まり、最前面のビューがタッチされるまで、前後の順序でサブビューを検索します。そのビューはヒットテストビューになり、タッチイベントを受け取ります。このプロセスに関わる各ビューは、イベントの場所が境界内にあるかどうかを最初にテストします。テストが成功した後でのみ、ビューはさらにヒットテストのためにサブビューにイベントを渡します。したがって、ビューがタッチされているが親ビューの境界外にある場合、親ビューはイベントの場所をテストできず、タッチイベントはビューに渡されません。

+0

ありがとう、@ Putz1103 – Verticon