UIView之userInteractionEnabled屬性介紹

屬性做用

       該屬性值爲布爾類型,如屬性自己的名稱所釋,該屬性決定UIView是否接受並響應用戶的交互。

       當值設置爲NO後,UIView會忽略那些本來應該發生在其自身的諸如touch和keyboard等用戶事件,並將這些事件從消息隊列中移除出去。當值設置爲YES後,這些用戶事件會正常的派發至UIView自己(前提事件確實發生在該view上),UIView會按照以前註冊的事件處理方法來響應這些事件。

       在一次動畫執行流程中,動畫包含的全部UIView都會被臨時禁止用戶交互,而無論每一個UIView自己userInteractionEnabled此時的屬性值是YES仍是NO。可是在配置動畫時,經過添加UIViewAnimationOptionAllowUserInteraction選項能夠禁止這種行爲的發生,使UIView即便是在執行動畫期間依然能響應用戶事件。

發揮做用的簡單原理描述

       熟悉IOS消息響應鏈的開發者都瞭解Hit-Testing的基本過程,此處對此不作深究,咱們能夠簡單的理解爲在一次用戶的touch交互中,是hit-test決定了Application的整個view層次結構中,到底該由哪一個view去接收並處理該事件。其基本的篩選過程能夠粗糙的敘述爲:

  1. touch事件發生,建立UIEvent對象
  2. 按照Application的view層次結構,逐層調用每一個view的hitTest:withEvent:方法,並傳入該event對象,view根據hitTest:withEvent:方法和來決定touch點是否包含在本身的bounds中;
  3. 若是view的bounds包含了touch點,該view會遍歷本身的subview,並調用每一個subview的pointInside:withEvent:方法來進一步決定touch事件是發生在本身自己,仍是本身的subview上。
  4. 重複第二,三步,並篩選出最終接受touch事件的view對象

       咱們關注的是篩選過程的第3步,view調用hitTest:withEvent:方法時,會受userInteractionEnabled屬性設置的影響,若是當view的該屬性值設置爲NO時,即便最終touch點確實包含在view的bounds中,該view也會忽略touch事件,固然userInteractionEnabled的設置只是touch篩選的條件之一,在真正的篩選過程當中還包含了其餘因素的考慮,所以還要參考hitTest:withEvent:的具體方法描述,但以上描述我的感受足夠咱們理解userInteractionEnabled屬性的基本原理。

特殊子類的覆蓋

       userInteractionEnabled屬性默認值爲YES,但UIView的一些子類中對該屬性進行了覆蓋,並將其默認值設置爲了NO,其中UIImageView和UILabel就是這樣的類。userInteractionEnabled屬性在UIImageView和UILabel的文檔中都有簡單的描述。在實際的界面開發過程當中,咱們常常用UIImageView來模擬按鈕或其它能夠響應用戶touch事件的顯示區,並經過gesture來爲其添加事件響應,所以爲了保證事件能正常的接受,咱們必需要顯示的將UIImageView對象的userInteractionEnabled的值設爲YES 。

注:描述於IOS5.1下 ide

相關文章
相關標籤/搜索