iOS事件傳遞和響應

?背景

對于身處中小公司且業務不怎么復雜的程序員來說,很多技術不常用,你可能看過很多遍也都大致了解,但是實際讓你講,不一定講的清楚。你可能說,我以獨當一面,應對自如了,但是技術的知識甚多,我們常用的只是十之一二,甚至更少。這么多知識,怎么更好的理解和學習?如果實操的場景少,推薦通過AI對話,不斷的提問,然后對他的回答進行反復的驗證校準,加深理解。

今天就住要講一下iOS的事件傳遞和響應

事件傳遞和響應

1、概述

事件傳遞過程:從application傳遞到最上層view,如下圖

事件傳遞過程

事件響應處理過程:從最上層view開始向下傳遞,與事件傳遞方向相反(響應鏈)

事件響應過程

2、事件傳遞細節?

當用戶點擊頁面的某個位置時,application將觸發事件傳遞

  • 從application到window,到ViewController,到view、subview
  • 如果某個view可以處理這個事件,則繼續查找其子view,查找子view的時候從最后添加的開始檢查,一旦某個子view可以處理這個事件則停止遍歷,子view重復此過程。如果子view都不可處理事件則返回自己,事件查找結束。

什么條件算是“可以處理這個事件”,需要同時滿足以下條件

  • view沒有隱藏,hidden?= NO

  • 允許交互,userInteractionEnabled = YES

  • 透明度alpha > 0.01,注意等于0.01的時候就已經無法響應事件了

  • pointInside: withEvent:返回YES,也就是說view覆蓋區域包含點擊位置。也可以重寫函數,指定一定范圍內的點擊都算到自己身上(常用于擴大按鈕的點擊范圍)。

所以傳遞過程的代碼大致如下

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {// 檢查視圖是否滿足基本條件if (!self.isUserInteractionEnabled || self.isHidden || self.alpha <= 0.01) {return nil;}// 檢查觸摸點是否在視圖范圍內if (![self pointInside:point withEvent:event]) {return nil;}// 從后往前遍歷子視圖NSInteger count = self.subviews.count;for (NSInteger i = count - 1; i >= 0; i--) {UIView *subview = self.subviews[i];// 將觸摸點轉換到子視圖的坐標系中CGPoint subPoint = [self convertPoint:point toView:subview];// 遞歸調用子視圖的 hitTest:withEvent: 方法UIView *hitView = [subview hitTest:subPoint withEvent:event];if (hitView) {return hitView;}}// 如果沒有子視圖能處理事件,則返回自身return self;
}

事件傳遞結束后,這個事件的響應鏈就定下來了,響應鏈之外的view就沒有機會處理事件了,即使他可以處理也不行。這里解釋一下,根據前面提到的傳遞規則,對于同一個view的子view,最后添加的擁有絕對的優先權,如果他能處理這個事件,則即使他不處理這個事件,他的兄弟view也么有機會處理。

3、事件響應

事件傳遞結束,響應鏈被確認,則進行事件響應階段

從最后的view開始確認是否處理了事件,如果處理了,則停止向下傳遞,過程結束

事件響應

首先,根據處理方式的不同,可分為3種:

  • UIControl,如按鈕通過 target-action 機制直接將事件傳遞給控件
  • 手勢識別器,給view添加gestureRecognizer系列識別,綁定事件回調
  • 觸摸事件鏈,通過view的touchesBegan、touchesEnded來攔截處理的自帶事件

每種處理方式有各自的傳遞鏈條,不會串行,其中

  • UIControl,如果在最上層且“可以處理這個事件”,則父視圖的其他方式(touche\gesture)會被阻斷。應該他的內部實現上,將touche和gesture都阻斷了。
  • 手勢識別器(gestureRecognizer),如果子view添加了手勢,則點擊子view的時候,父view還會收到touchesBegan、touchesEnded的回調,也就是說touche和gesture會同時觸發。如果父子view同時設置了手勢(比如都是tapGesture),則子view會阻斷手勢事件的傳遞,父view不會收到點擊事件。
  • 觸摸事件鏈,如果想中斷,則在touchesBegan中不調用super即可中斷。如果不想中斷,則實現touchesBegan處理事件的同時,可繼續調用super,響應鏈的其他元素就還有機會收到事件和處理事件。

以上就是我對事件傳遞和響應的理解,其重點就是明白傳遞過程,傳遞的條件,響應鏈

那些容易讓誤解的詞語

1、很多文章提到傳遞方向“從上到下”、“從下到上”,這樣子講,并不知道到底從哪到哪傳遞。本文結合了圖片層級做了說明,希望大家能夠明白。

2、查找響應者的過程,很多文章提到“如果view不能處理事件”則...,這種說法我是不贊同的,如果view不能處理事件,那根本就不會傳給他,更別提進入響應鏈了。這里適合的詞應該是“不處理”,或者更恰當點理解是“不攔截”。我們都知道,通過touchesBegan處理事件的時候,如果你調用了super方法,事件還會繼續傳遞,這時候就可以有多個view同時響應事件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70394.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70394.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70394.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FFmpeg 源碼編譯安裝

參考&#xff1a; https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu Linux (Ubuntu) 下載 FFmpeg 源碼&#xff0c;并將其解壓&#xff0c;這里我將它放在 ~/ffmpeg_source 目錄下&#xff1b; cd ~/ffmpeg_sources wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org…

【pytest】編寫自動化測試用例命名規范README

API_autoTest 項目介紹 1. pytest命名規范 測試文件&#xff1a; 文件名需要以 test_ 開頭或者以 _test.py 結尾。例如&#xff0c;test_login.py、user_management_test.py 這樣的命名方式&#xff0c;pytest 能夠自動識別并將其作為測試文件來執行其中的測試用例。 測試類…

Windows桌面系統管理5:Windows 10操作系統注冊表

Windows桌面系統管理0&#xff1a;總目錄-CSDN博客 Windows桌面系統管理1&#xff1a;計算機硬件組成及組裝-CSDN博客 Windows桌面系統管理2&#xff1a;VMware Workstation使用和管理-CSDN博客 Windows桌面系統管理3&#xff1a;Windows 10操作系統部署與使用-CSDN博客 Wi…

llama.cpp將sensor格式的大模型轉化為gguf格式

前言 ollama本地只能導入gguf格式的大模型文件&#xff0c;將safetensors 文件轉化為gguf格式。需要使用 llama.cpp 這個開源工具。以下是使用 llama.cpp 轉換 .safetensors 格式模型到 .gguf 格式的詳細步驟: 1. 首先克隆并編譯 llama.cpp: 克隆項目 git clone https://gi…

【運維】源碼編譯安裝cmake

背景&#xff1a; 已經在本地源碼編譯安裝gcc/g&#xff0c;現在源碼安裝cmake 下載源碼 下載地址&#xff1a;CMake - Upgrade Your Software Build System 安裝步驟&#xff1a; ./bootstrap --prefix/usr/local/cmake make make install 錯誤處理 1、提示找不到libmpc.…

如何通過AI優化敏捷開發中的任務管理與分配?

用ChatGPT做軟件測試 在現代軟件開發中&#xff0c;敏捷開發&#xff08;Agile&#xff09;已成為一種廣泛采用的開發方法論&#xff0c;其核心思想是強調快速響應變化、與客戶的持續溝通以及團隊協作的高效性。然而&#xff0c;隨著項目規模的不斷擴大&#xff0c;敏捷開發面臨…

petalinux高版本設置自動登錄和開機自啟動配置

petalinux-config -c rootfs 依次選擇 Image Features -> serial-autologin-root 這是配置 進來就是root權限 創建并安裝名為 myapp-init 的新建應用程序 petalinux-create -t apps --template install -n myapp-init --enable 編輯 project-spec/meta-user/recipes-…

STM32 USB 設備的描述信息作用

在使用 STM32 USB 功能時 usbd_desc.c 文件中定義了一段宏&#xff0c;以下解每段宏的用途。 #define USBD_VID 1155 #define USBD_LANGID_STRING 1033 #define USBD_MANUFACTURER_STRING "STMicroelectronics" #define US…

React通用登錄/注銷功能實現方案(基于shadcn/ui)

React通用登錄/注銷功能實現方案&#xff08;基于shadcn/ui&#xff09; 一、功能需求分析二、通用功能封裝1. 通用登錄表單組件2. 認證Hook封裝 三、功能使用示例1. 登錄頁面實現2. 用戶菜單實現 四、路由保護實現五、方案優勢 一、功能需求分析 需要實現以下核心功能&#x…

jEasyUI 創建學校課程表

jEasyUI 創建學校課程表 引言 隨著信息技術的飛速發展,教育行業也迎來了數字化轉型的浪潮。學校課程表的創建和管理作為教育信息化的重要組成部分,其效率和準確性直接影響到學校的教學秩序。jEasyUI,作為一款優秀的開源UI框架,憑借其易用性、靈活性和豐富的組件,成為了許…

Linux 內核中的 container_of 宏:以 ipoib_rx_poll_rss 函數為例

在 Linux 內核編程中,container_of 是一個非常實用的宏,主要用于通過結構體的成員指針來獲取包含該成員的整個結構體的指針。rx_ring = container_of(napi, struct ipoib_recv_ring, napi); 在代碼中就是利用了這個宏,下面我們詳細分析它的作用和工作原理。 背景知識 在內…

【論文學習】RVS-FDSC:一種基于四方向條帶卷積的視網膜血管分割方法以增強特征提取

寫在前面&#xff1a;本博客僅作記錄學習之用&#xff0c;部分圖片來自網絡&#xff0c;如需引用請注明出處&#xff0c;同時如有侵犯您的權益&#xff0c;請聯系刪除&#xff01; 文章目錄 前言論文論文內容RSC模塊MSPF2 模塊RPDA模塊 實驗效果 總結互動致謝參考往期回顧 前言…

藍橋杯篇---IAP15F2K61S2矩陣鍵盤

文章目錄 前言簡介矩陣鍵盤的工作原理1.行掃描2.檢測列狀態3.按鍵識別 硬件連接1.行線2.列線 矩陣鍵盤使用步驟1.初始化IO口2.掃描鍵盤3.消抖處理4.按鍵識別 示例代碼&#xff1a;4x4矩陣鍵盤掃描示例代碼&#xff1a;優化后的矩陣鍵盤掃描注意事項1.消抖處理2.掃描頻率3.IO口配…

【ISO 14229-1:2023 UDS診斷(ECU復位0x11服務)測試用例CAPL代碼全解析?】

ISO 14229-1:2023 UDS診斷【ECU復位0x11服務】_TestCase19 作者&#xff1a;車端域控測試工程師 更新日期&#xff1a;2025年02月19日 關鍵詞&#xff1a;UDS診斷協議、ECU復位服務、0x11服務、ISO 14229-1:2023 TC11-019測試用例 用例ID測試場景驗證要點參考條款預期結果TC…

Vue 3 30天精進之旅:Day 29 - 項目實戰

在學習了近一個月的Vue 3知識后&#xff0c;今天是我們學習旅程的第29天。在這一天&#xff0c;我們將專注于實踐&#xff0c;通過一個小型項目來鞏固之前的學習成果&#xff0c;并為之后的展示做好準備。 一、項目目標 我們將構建一個簡單的個人博客應用&#xff0c;具備以下…

Windows Docker運行Implicit-SVSDF-Planner

Windows Docker運行GitHub - ZJU-FAST-Lab/Implicit-SVSDF-Planner: [SIGGRAPH 2024 & TOG] 1. 設置環境 我將項目git clone在D:/Github目錄中。 下載ubuntu20.04 noetic鏡像 docker pull osrf/ros:noetic-desktop-full-focal 啟動容器&#xff0c;掛載主機的D:/Github文…

PHP 安全與加密:守護 Web 應用的基石

PHP 學習資料 PHP 學習資料 PHP 學習資料 在當今數字化時代&#xff0c;Web 應用無處不在&#xff0c;而 PHP 作為一種廣泛使用的服務器端腳本語言&#xff0c;承載著無數網站和應用的核心邏輯。然而&#xff0c;隨著網絡攻擊手段日益復雜&#xff0c;PHP 應用面臨著諸多安全…

Qt中使用QPdfWriter類結合QPainter類繪制并輸出PDF文件

一.類的介紹 1.QPdfWriter介紹 Qt中提供了一個直接可以處理PDF的類&#xff0c;這就是QPdfWriter類。 &#xff08;1&#xff09;PDF文件生成 支持創建新的PDF文件或覆蓋已有文件&#xff0c;通過構造函數直接綁定文件路徑或QFile對象&#xff1b; 默認生成矢量圖形PDF&#…

Golang GORM系列:GORM無縫集成web框架

高效的數據管理是每個成功的web應用程序的支柱。GORM是通用的Go對象關系映射庫&#xff0c;它與流行的Go web框架搭配得非常好&#xff0c;提供了無縫集成&#xff0c;簡化了數據交互。本指南將帶你探索GORM和web框架&#xff08;如Gin&#xff0c; Echo和Beego&#xff09;之間…

SAM C++ TensorRT(實時圖像分割)

SPEED SAM C TENSORRT &#x1f310; 1、概述 用于SAM&#xff08;segment anything model分割一切模型&#xff09;的TensorRT和CUDA優化的高表現C實現&#xff0c;特別適用于實時圖像分割任務。 &#x1f4e2; 更新 模型轉換&#xff1a;從ONNX模型構建TensorRT引擎以加速…