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]);