1. 程式人生 > >[iOS diary] UIImageView,UILabel等加gesture recognizer不成功,神祕屬性userInteractionEnabled

[iOS diary] UIImageView,UILabel等加gesture recognizer不成功,神祕屬性userInteractionEnabled

某天,我對一個UIImageView addGestureRecognizer怎麼搞都沒有反應。後來,老大告訴我有這個屬性,我enable之發現還是不行,後來才發現我的UIImageView是add到另外一個UIImageView上的,把父層UIImageView enable userInteractionEnabled之後就成功了。

這是因為iOS的事件機制先自底的UIApplication-UIWindow-UIView向頂遞迴利用HitTest尋找第一響應者,然後在形成的響應者鏈中遞歸回溯進行事件處理,若事件在高層被處理就不會再將該事件向響應鏈底層傳送。如需要繼續向底層傳送,需進行特殊處理。

目測,userInteractionEnable是在自底向頂尋找第一響應者,構築響應者鏈的時候作為輔助尋找的標誌。

附:userInteractionEnable的翻譯介紹:http://blog.csdn.net/likendsl/article/details/7575023

附:講解iOS事件處理機制的好博文:http://www.cnblogs.com/Quains/p/3369132.html

裡面有三句話很能概括事件處理

1、iOS判斷哪個介面能接受訊息是從View層級結構的父View向子View傳遞,即樹狀結構的根節點向葉子節點遞迴傳遞。2、hitTest和pointInside成對,且hitTest會呼叫pointInside。3、iOS的訊息處理是,當訊息被人處理後預設不再向父層傳遞。


關於IOS事件處理,再拓展一下關於運動事件和觸控事件的一些小差異,下文來源於網路,貌似連結已廢,只能從百度快照找到:

當用戶發起一個事件,比如觸控式螢幕幕或者晃動裝置,系統產生一個事件,同時投遞給UIApplication,而UIApplication則將這個事件傳遞給特定的UIWindow進行處理(正常情況都一個程式都只有一個UIWindow),然後由UIWindow將這個事件傳遞給特定的物件(即first responder)並通過響應鏈進行處理。雖然都是通過響應鏈對事件進行處理,但是觸控事件和運動事件在處理上有著明顯的不同(主要體現在確定哪個物件才是他們的first responder):

        觸控事件是通過HitTest來確定first responder(整個過程和Windows中對訊息的處理基本是一樣的):當一個事件發生時,UIWindow將這個事件傳遞給當前可見的最頂端的view進行hitTest,並在這個hitTest裡面進行遞迴查詢,直到找到能夠響應hitTest的最底層的那個Responder,確定為first responder。然後從這個responder開始進行處理這個事件,如果不能處理,則往上冒泡直到有一個Responder可以對這個事件進行處理為止。但是運動事件卻不太一樣,它並不用進行HitTest,而是直接以響應鏈中被指定為first responder的物件為起點,通過響應鏈進行事件的分發和處理。第一個加入到UIWindow中的ViewController即是運動事件的first responder。這也就解釋了為啥後加入的view不會被正常的旋轉:雖然都是通過first responder開始分發事件,但是一個有進行hittest,一個沒有,雖然大多數情況下hittest view和first responder是同一個view,但也不絕對。正如旋轉的這個例子一樣。


From:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f72967848c403a87cf1dc7330714506694ea7a7d0d04d1c67f7a03a4545ceeed6d2f761457b28cbb825dd7cb855f289f57476716f25665d50edfc0512fb137e75cfedf6af0b08025e4a8c5a3af4323ce44727d97838d4d0a12dd18f5033ae1b1934c022814ad9d3772f55a605e9a3433bc50f3902f7a42dcb68b53179e6bc7616080de46a74f12a263d5086f5353a13ca678573143e45856fd534a7285eb2cf05b785753b45fc2bed6c09d&p=9e70d00f86cc41a959a9c7710f4780&newp=8b2a97079c934eaf5eecde2c5448cf231610db2151d6db143d9e&user=baidu&fm=sc&query=iOS+%CA%C2%BC%FE%B4%A6%C0%ED+%C3%B0%C5%DD&qid=&p1=1