iOS 12:modal、事件傳遞與處理、手勢

Modal

  • 除了push之外,這是另外一種控制器的切換方式
  • 任何控制器都能通過Model的形式展示出來
  • 以Model 的形式展示控制器:presentViewController:
  • 關(guān)閉當(dāng)初Model出來的控制器:dismissViewControllerAnimated:
  • 使用時(shí)機(jī):前后兩個(gè)控制器沒有多少信息邏輯上的關(guān)連時(shí);當(dāng)前后控制器有明顯邏輯上的層級(jí)關(guān)系時(shí),用 UINavigationController 和 push
  • modal出誰,誰就有權(quán)利dismiss
  • 誰modal控制器,誰也有權(quán)利dismiss

iOS 中的事件

  • 在用戶使用app過程中,會(huì)產(chǎn)生各種各樣的事件
  • 大體分為3大類型
    • 1.觸摸事件
    • 2.加速計(jì)事件
    • 3.遠(yuǎn)程控制事件
  • 響應(yīng)者對(duì)象:在iOS中不是任何對(duì)象都能處理事件,只有繼承了UIResponder的對(duì)象才能接收并處理事件
  • UIApplicaiton UIViewController UIView 都繼承自 UIResponder,因此它們都是響應(yīng)者對(duì)象,都能夠接收并處理事件。
圖片 12.png
  • UITouch
    • 當(dāng)用戶用一根手指觸摸屏幕時(shí),會(huì)創(chuàng)建一個(gè)與手指相關(guān)連的UITouch對(duì)象
    • 一根手指對(duì)應(yīng)一個(gè)UITouch對(duì)象
    • UTouch 的作用:保存著跟手指相關(guān)的信息,比如觸摸的位置、時(shí)間、階段
    • 當(dāng)手指移動(dòng)時(shí),系統(tǒng)會(huì)更新同一個(gè)UITouch對(duì)象,使之能夠一直保存該手指在的觸摸位置
    • 當(dāng)手指離開屏幕時(shí),系統(tǒng)會(huì)銷毀相應(yīng)的UITouch對(duì)象。
  • UIEvent
    • 每產(chǎn)生一個(gè)事件,就會(huì)產(chǎn)生一個(gè)UIEvent對(duì)象
    • UIEvent:稱為事件對(duì)象,記錄事件產(chǎn)生的時(shí)刻和類型。
    • UIEvent還提供了相應(yīng)的方法可以獲得在某個(gè)view上面的磋磨對(duì)象UITouch
圖片 13.png

事件的產(chǎn)生與傳遞

  • 產(chǎn)生與傳遞過程

    • 發(fā)生觸摸事件后,系統(tǒng)會(huì)將該事件加入到一個(gè)由UIApplicaiton管理的事件隊(duì)列中。
    • UIApplication會(huì)從事件隊(duì)列中取出最前面的事件,并將事件分發(fā)下去以便處理。通常,先發(fā)送事件給應(yīng)用程序的主窗口(keyWindow)
    • 主窗口會(huì)在視圖層次結(jié)構(gòu)中找到一個(gè)最合適的視圖來處理觸摸事件,這也是整個(gè)事件過程的第一步
    • 找到合適的視圖控件后,就會(huì)調(diào)用視圖控件的touches方法來作具體的事件處理。
  • 觸摸事件的傳遞從父控件傳遞到子控件。

  • 如果父控件不接受觸摸事件,那么子控件也不會(huì)接受觸摸事件。

  • 如何找到最合適的控件來處理事件

    • 1.自己能否接收觸摸事件
    • 2.觸摸點(diǎn)是否在自己身上
    • 3.從后往前遍歷子控件,重復(fù)前面的2個(gè)步驟
    • 4.如果沒有符合條件的子控件,那么就自己最適合處理
  • UIView不接受觸摸事件的3中情況

    • 1.userInterationEnabled = NO
    • 2.hidden = YES
    • 3.alpha = 0 ~ 0.01
    • UIImageView的 userInterationEnabled默認(rèn)是 NO

hitTest、pointInside

  • 什么時(shí)候調(diào)用:當(dāng)事件傳遞給控件的時(shí)候,就會(huì)調(diào)用控件的這個(gè)方法。
  • hitTest作用:為了尋找最合適的view
  • 重寫該方法,可以改變事件本來的傳遞與處理流程
  • 底層實(shí)現(xiàn):遞歸
  • point:當(dāng)前的觸摸點(diǎn),point這個(gè)點(diǎn)的坐標(biāo)系就是方法調(diào)用者
  • pointInside:判斷當(dāng)前的觸摸點(diǎn)是否在不在方法調(diào)用者上?
  • 子控件超過父控件,是不能夠處理事件的,除非重寫hitTest:方法。

響應(yīng)者鏈條

  • 定義:是由多個(gè)響應(yīng)者對(duì)象連接起來的鏈條
  • 作用:能很清楚的看見每個(gè)響應(yīng)者之間的聯(lián)系,并且可以讓一個(gè)時(shí)間多個(gè)對(duì)象處理
  • 響應(yīng)者對(duì)象:能處理事件的對(duì)象
圖片 15.png
  • 事件傳遞的完整過程
圖片 16.png
  • 響應(yīng)者鏈的事件傳遞過程
    • 如果view的控制器存在,就傳遞給控制器;如果控制器不存在,則將其傳遞給它的父視圖
    • 在視圖層次結(jié)構(gòu)的最頂級(jí)視圖,如果也不能處理收到的事件或消息,則其將事件或消息傳遞給window對(duì)象進(jìn)行處理
    • 如果window對(duì)象也不處理,則其將事件或消息傳遞給UIApplication對(duì)象
    • 如果UIApplication也不能處理該事件或消息,則將其丟棄

手勢識(shí)別

  • 利用UIGestureRecognizer,能輕松識(shí)別用戶在某個(gè)view上面做的一些常見手勢
  • 手勢種類
    • 1.點(diǎn)按 tap
    • 2.長按 longPress 長按手勢,默認(rèn)觸發(fā)兩次
    • 3.輕掃 swipe 默認(rèn)輕掃的方向是從左 ——> 右;如果以后想要一個(gè)控件支持多個(gè)方向的輕掃,必須創(chuàng)建多個(gè)輕掃手勢,一個(gè)輕掃手勢只支持一個(gè)方向
    • 4.旋轉(zhuǎn) rotation 默認(rèn)傳遞的旋轉(zhuǎn)的角度是相對(duì)于最開始的位置
    • 5.縮放 scale
    • 6.拖拽 pan
  • 默認(rèn)不支持多個(gè)手勢,需要遵守協(xié)議 < UIGestureRecognizerDelegate > ,重寫方法。
  • 協(xié)議中的方法包含有:是否允許觸發(fā)手勢,是否允許手指的觸摸點(diǎn)(可以實(shí)現(xiàn)手勢區(qū)域觸發(fā))

tips:

  • 1.如何把C語言字符串轉(zhuǎn)化為OC字符串?
    char *c = "abc";
    NSLog(@"%@", [@(c) class]);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容