iOS_UI_04_事件處理

事件處理

一、事件的基本概念
1.事件就是當(dāng)用戶手指觸擊屏幕及在屏幕上移動(dòng)時(shí)泪幌,系統(tǒng)不斷發(fā)送給應(yīng)用程序的對(duì)象
2.系統(tǒng)將事件按照特定的路徑傳遞給可以對(duì)其進(jìn)行處理的對(duì)象
3.在iOS中吃型,一個(gè)UITouch對(duì)象表示一個(gè)觸摸唧瘾,一個(gè)UIEvent對(duì)象表示一個(gè)事件,事件對(duì)象中包含與當(dāng)前多點(diǎn)觸摸序列相對(duì)應(yīng)的所有觸摸對(duì)象缨该,還可以提供與特定視圖或窗口相關(guān)聯(lián)的觸摸對(duì)象
4.事件類型:觸摸事件(Multitouch events)偎行、晃動(dòng)事件(Accelerometer events)、遠(yuǎn)程事件(Remote control events)---了解傳感器
二贰拿、觸摸的基本概念
1.觸摸事件的處理方法:
    1.當(dāng)手指接觸到該視圖(屏幕)的時(shí)候蛤袒,會(huì)觸發(fā)的方法
        參數(shù)解釋:觸控對(duì)象的集合:當(dāng)前觸控所觸發(fā)的事件
        - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{}
    2.觸控對(duì)象移動(dòng)的時(shí)候觸發(fā)的方法
        - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{}
    3.觸控對(duì)象離開(kāi)的時(shí)候觸發(fā)的方法
        - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{}
    4.觸摸被打斷的時(shí)候觸發(fā)的方法
        - (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{}
2.觸摸事件中涉及的方法
     1.獲取視圖的中心點(diǎn)---self.beginPoint = self.center;
     2.得到觸控對(duì)象---UITouch* touch = [touches anyObject];
     3.得到當(dāng)前的center點(diǎn)---CGPoint currentPoint = [touch locationInView:self];
     4.獲取上一個(gè)點(diǎn)的位置---CGPoint prePoint = [touch previousLocationInView:self];
     5.得到視圖原來(lái)的位置---CGPoint currentCenter = self.center;
     6.X軸上的變化
           currentCenter.x += (currentPoint.x - prePoint.x);
           currentCenter.y += (currentPoint.y - prePoint.y);
    7.得到新的center點(diǎn)之后,將當(dāng)前的視圖的center點(diǎn)變?yōu)橛?jì)算之后的center---self.center = currentCenter;
3.畫板的代碼
    1.貝塞爾曲線的用法
         1.創(chuàng)建對(duì)象---UIBezierPath* bezierPath = [UIBezierPath bezierPath];
         2.將當(dāng)前手指觸摸的點(diǎn)加入到曲線中作為起始點(diǎn)---[bezierPath moveToPoint:startPoint];
         3.將曲線對(duì)象添加到可變數(shù)組中---[self.allLinesArray addObject:bezierPath];
         4.獲取當(dāng)前正在繪制的線條對(duì)象---UIBezierPath* bezierPath = [self.allLinesArray lastObject];
         5.將移動(dòng)產(chǎn)生的點(diǎn)添加到現(xiàn)有的線條上---[bezierPath addLineToPoint:newPoint];
         6.繪制線條膨更,對(duì)當(dāng)前的界面進(jìn)行重新繪制妙真,當(dāng)View調(diào)用該方法的時(shí)候,意思就是立即重新繪制荚守,系統(tǒng)就會(huì)自動(dòng)調(diào)用drawrect方法珍德。---[self setNeedsDisplay];---當(dāng)前顯示有變化的時(shí)候练般,記得重新繪制當(dāng)前界面
         7.繪制當(dāng)前視圖---
            - (void)drawRect:(CGRect)rect{
               //遍歷數(shù)組,取出所有的線進(jìn)行繪制
                for (UIBezierPath* line in self.allLinesArray) {
                //得到line在allLinesArray數(shù)組中的位置锈候,根據(jù)該位置從colorArray中取出對(duì)應(yīng)的顏色
                NSInteger index = [self.allLinesArray indexOfObject:line];
                //設(shè)置畫筆顏色
                [[self.allLinesColorArray objectAtIndex:index] setStroke];
                //設(shè)置畫筆寬度
                [line setLineWidth:10.0];
                //開(kāi)始畫線
                [line stroke];
                }
                }
    2.隨機(jī)數(shù)的用法
        mLabel.backgroundColor = [UIColor colorWithRed:arc4random() % 256 / 255.0 green:arc4random() % 256 / 255.0 blue:arc4random() % 256 / 255.0 alpha:1.0];
    3.清空薄料,撤銷,刪除的時(shí)候需判斷界面是否含有線條
        //當(dāng)界面有線條的時(shí)候泵琳,我們才需要?jiǎng)h除
         if (!self.allLinesArray.count) {
        //說(shuō)明當(dāng)前沒(méi)有線條對(duì)象,不需要?jiǎng)h除摄职,直接return
              return;
          }
    4.撤銷功能的實(shí)現(xiàn)
        1.在刪除之前從繪制好的線條的可變數(shù)組中獲取要?jiǎng)h除的東西,添加到另一個(gè)專門用來(lái)實(shí)現(xiàn)撤銷功能可變數(shù)組
        2.在撤銷的方法體中獲取撤銷數(shù)組中的元素获列,添加到原有可變數(shù)組中谷市,并刪除撤銷的可變數(shù)組中的元素
三、響應(yīng)者鏈
響應(yīng)者:
    iOS中所有能響應(yīng)事件(觸摸蛛倦、晃動(dòng)歌懒、遠(yuǎn)程事件)的對(duì)象都是響應(yīng)者
    系統(tǒng)定義了一個(gè)抽象的父類UIResponder來(lái)表示響應(yīng)者。其子類都是響應(yīng)者溯壶。
響應(yīng)者鏈的兩個(gè)流程
    檢測(cè):硬件檢測(cè)--》UIApplication--》window--》viewController--》View--》檢測(cè)所有子視圖
    響應(yīng):觸摸的視圖--》viewController--》window--》UIApplication
    如果響應(yīng)者沒(méi)有處理事件及皂,事件會(huì)向下傳遞,知道UIAPPlication且改。如果沒(méi)有響應(yīng)者處理验烧,則會(huì)丟棄觸摸事件
四、手勢(shì)
1.手勢(shì)識(shí)別器:是對(duì)觸摸事件做了封裝又跛,手勢(shì)識(shí)別器本身起到了識(shí)別作用碍拆;是iOS中比較抽象的一個(gè)類,用于識(shí)別一個(gè)手勢(shì)慨蓝,所謂手勢(shì):有規(guī)律的觸摸
2.七種手勢(shì)識(shí)別器:
    1.UITapGestureRecognizer:是輕拍手勢(shì)識(shí)別器感混,能識(shí)別輕拍操作
    2.UILongPressGestureRecognizer:是長(zhǎng)按手勢(shì)識(shí)別器,能識(shí)別長(zhǎng)按操作
    3.UIRotationGestureRecognizer:是旋轉(zhuǎn)手勢(shì)識(shí)別器礼烈,能識(shí)別旋轉(zhuǎn)操作
    4.UIPinchGestureRecognizer:是捏合手勢(shì)識(shí)別器弧满,能識(shí)別捏合操作
    5.UIPanGestureRecognizer:是平移手勢(shì)識(shí)別器,能識(shí)別平移操作
    6.UISwipeGestureRecognizer:是清掃手勢(shì)識(shí)別器此熬,能識(shí)別清掃操作
    7.UIScreenEdgePanGestureRecognizer:是屏幕邊緣清掃識(shí)別器庭呜。
3.View的transform屬性
    transform是View的一個(gè)重要屬性,它在矩陣層面上改變View的顯示狀態(tài)犀忱,能實(shí)現(xiàn)View的縮放募谎、旋轉(zhuǎn)、平移等功能
    1.平移:CGAffineTransformMakeTranslation(newPoint.x, newPoint.y);
      第二種:sender.view.transform = CGAffineTransformMakeTranslation(newPoint.x, newPoint.y);
            //平移的復(fù)原             平移量為0
            [sender setTranslation:CGPointZero inView:sender.view];
    2.縮放:makeScale:每次的縮放都是在初始狀態(tài)下進(jìn)行縮放阴汇,例如:這里他每次縮放都是在scale = 1的基礎(chǔ)上進(jìn)行操作数冬。
            imgView.transform = CGAffineTransformMakeScale(scale, scale);
      第二種://得到捏合的比率
             float scale = sender.scale;
            //根據(jù)比率改變視圖大小,2D仿射變換函數(shù)搀庶,通過(guò)操作矩陣來(lái)改變對(duì)應(yīng)的視圖吉执。transform:矩陣
            //參數(shù)解釋:第一個(gè)參數(shù):視圖原有的矩陣疯淫,第二個(gè)參數(shù)為:X軸方向縮放比率,第三個(gè)參數(shù)為:y軸方向縮放比率
            //在縮放結(jié)束的基礎(chǔ)上戳玫,再次進(jìn)行更改熙掺。
            imgView.transform = CGAffineTransformScale(imgView.transform, scale, scale); 
            //當(dāng)一次捏合完成的時(shí)候,記得將縮放比率復(fù)原咕宿,因?yàn)樗且粋€(gè)累加的過(guò)程币绩,如果不復(fù)原,縮放就會(huì)越來(lái)越快
            sender.scale = 1.0;
    3.旋轉(zhuǎn):CGAffineTransformMakeRotation
4.手勢(shì)的代理:
    1.添加代理協(xié)議
    2.設(shè)置方法支持多個(gè)手勢(shì)同時(shí)響應(yīng)
       - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(nonnull UIGestureRecognizer *)otherGestureRecognizer{
         return YES;
        }
    3.添加手勢(shì)是需確定打開(kāi)用戶交互---UIImageView用戶交互默認(rèn)是關(guān)閉的府阀,他阻斷了響應(yīng)者鏈的檢測(cè)過(guò)程缆镣,所以如果控件的用戶交互是關(guān)閉的,那么該控件及其子視圖都不會(huì)響應(yīng)任何和觸摸事件有關(guān)的方法
    imgView.userInteractionEnabled = YES;
5.其他:
    1.設(shè)置顯示圓形圖片--交互還是原圖片大小
       將圖片設(shè)置為圓形--裁圓试浙,圓角
       imgView.layer.cornerRadius = 50.0;
       imgView.layer.masksToBounds = YES;
    2.copy的用法董瞻,只有遵循了copy協(xié)議的屬性才可以使用copy
    3.設(shè)置圖片鋪滿全屏  bounds以(0,0)點(diǎn)開(kāi)始放置
      imgView.frame = self.view.bounds;
通常與UIView及其子類結(jié)合使用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末田巴,一起剝皮案震驚了整個(gè)濱河市钠糊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌壹哺,老刑警劉巖抄伍,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異管宵,居然都是意外死亡截珍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門箩朴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)岗喉,“玉大人,你說(shuō)我怎么就攤上這事炸庞∏玻” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵燕雁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鲸拥,道長(zhǎng)拐格,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任刑赶,我火速辦了婚禮捏浊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撞叨。我一直安慰自己金踪,他們只是感情好浊洞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著胡岔,像睡著了一般法希。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上靶瘸,一...
    開(kāi)封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天苫亦,我揣著相機(jī)與錄音,去河邊找鬼怨咪。 笑死屋剑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诗眨。 我是一名探鬼主播唉匾,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼匠楚!你這毒婦竟也來(lái)了巍膘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤油啤,失蹤者是張志新(化名)和其女友劉穎典徘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體益咬,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逮诲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幽告。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梅鹦。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冗锁,靈堂內(nèi)的尸體忽然破棺而出齐唆,到底是詐尸還是另有隱情,我是刑警寧澤冻河,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布箍邮,位于F島的核電站,受9級(jí)特大地震影響叨叙,放射性物質(zhì)發(fā)生泄漏锭弊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一擂错、第九天 我趴在偏房一處隱蔽的房頂上張望味滞。 院中可真熱鬧,春花似錦、人聲如沸剑鞍。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蚁署。三九已至便脊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間形用,已是汗流浹背就轧。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留田度,地道東北人妒御。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像镇饺,于是被迫代替她去往敵國(guó)和親乎莉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 好奇觸摸事件是如何從屏幕轉(zhuǎn)移到APP內(nèi)的奸笤?困惑于Cell怎么突然不能點(diǎn)擊了惋啃?糾結(jié)于如何實(shí)現(xiàn)這個(gè)奇葩響應(yīng)需求?亦或是...
    Lotheve閱讀 57,101評(píng)論 51 599
  • 在iOS開(kāi)發(fā)中經(jīng)常會(huì)涉及到觸摸事件监右。本想自己總結(jié)一下边灭,但是遇到了這篇文章,感覺(jué)總結(jié)的已經(jīng)很到位健盒,特此轉(zhuǎn)載绒瘦。作者:L...
    WQ_UESTC閱讀 6,010評(píng)論 4 26
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,138評(píng)論 25 707
  • 本篇包括2部分:前篇是UIResponder的官方API的記錄,后篇是對(duì)官方API的理解 UIResponder概...
    你好自己閱讀 1,425評(píng)論 0 7