2016-07-08 160 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 
    } 
    

    }

  2. 要我添加了一個子畫面主視圖,稱之爲子視圖。

  3. 要子視圖我已經添加了2個子視圖,調用它們subSubView1和subSubView2。

enter image description here

當我觸摸它們的邊界出現的意見和消失,因爲我期望的那樣。但是,如果我重新定位subSubView1(或subSubView2),使它部分位於子視圖的內部或部分位於子視圖的外部,則行爲會變得「奇怪」。如果我觸摸與SubView重疊的subSubView1的部分,則subSubView1將接收邊框。如果我觸摸與mainView重疊的subSubView1的部分,則它是接收邊框的mainView。有人請幫我理解這種行爲嗎?

Xcode 7.3,使用iPhone 6模擬器進行調試。

+0

試試這個:'mainView.bringSubviewToFront(touchedView)'。當你觸摸一個'subView'時放置這條線。 – Santosh

+0

如果視圖位於其父項之外,則該視圖不可選。我會假設觸摸事件從底部(mainView)冒泡。然後它轉到mainView的孩子。如果觸摸不在該孩子中,則停止。因此,不在其父節點中的部分不會接收不在其父節點中的觸摸事件。 – Putz1103

回答

0

如果視圖位於其父項之外,則該視圖不可選。我會假設觸摸事件從底部(mainView)冒泡。然後它轉到mainView的孩子。如果觸摸不在該孩子中,則停止。因此,不在其父節點中的部分不會接收不在其父節點中的觸摸事件。

有關更多信息,請參閱this question

在鏈接位於登錄牆後面時複製文本。

問:我的視圖在屏幕上正確顯示,但沒有收到任何觸摸事件。這是爲什麼?

答:這個問題最常見的原因是因爲你的視圖位於其父視圖的範圍之外。當您的應用程序收到觸摸事件時,將啓動命中測試過程以確定哪個視圖應該接收事件。該過程始於視圖層次結構的根(通常是應用程序的窗口),並以前後順序搜索子視圖,直到找到觸摸下的最前面的視圖。該視圖成爲命中測試視圖並接收觸摸事件。此過程中涉及的每個視圖首先測試事件位置是否在其範圍內。只有在測試成功後,視圖纔會將事件傳遞給子視圖以進行進一步的命中測試。因此,如果您的視圖位於其父視圖的邊界之外,則父視圖將無法測試事件位置,也不會將觸摸事件傳遞到視圖。

+0

謝謝@ Putz1103 – Verticon