事件處理
一、事件的基本概念
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)系作者