UI 第五天 代理設計模式 手勢識別器

一. target/action設計模式
target/action 設計模式是類似於button的設置方法一樣,可以讓view,imageView等實現類似button的點擊方法, 還有主要爲了 “解耦”,耦合是衡量一個程序寫的好壞的標準之一,也是衡量模塊與模塊之間關聯程度的指標. “高內聚,低耦合”是面向對象編程的核心思想. 另一方面也是因爲touch的侷限性,雖然view可以通過touch方法觸發事件,但是這樣點擊時間不科學也不全面.
target/action 核心思想: 需要讓目標去執行一個動作的地方

二.delegate模式
當一個類的某些功能需要被別人來實現,但是既不明確是些什麼功能,右不明確誰來實現這些功能的時候,委託模式就可以派上用場.
目的: 爲了降低類之間的耦合性.
步驟: 1.創建一個協議,不過不是創一個協議的文件,而是在你在你新建的視圖類裏面 @protocol ButtonImageViewDelegate
2.設置代理方法 (捕獲點擊事件)
- (void)buttonImageViewClick:(ButtonImageView *)buttonView;

3.設置代理人
@property(nonatomic,assign)iddelegate
添加代理屬性這邊有個問題 : 爲什麼要聲明成assign?
結論:防止循環引用 從而造成內存泄漏
例如 A是B的代理 B也是A的代理 結果是retain
[[A alloc]init]; 計數 1
[[B alloc]init]; 計數 1
A.delegate = B; B:2
B.delegate = A; A:2
[A release]; A:1
[B release]; B: 1
這時 A B 都釋放不掉 造成內存泄漏
這邊還有一個問題, 方法在聲明上面, 需要一個@class來解決這個問題
4. 讓代理取幹活 讓代理取調用代理方法
在touchEnd 裏面調用協議中的方法 這邊需要做一個代理保護,看這個類有沒有實現方法
if ([_delegate respondsToSelector:@selector(buttonImageViewClick:)]) {
[_delegate buttonImageViewClick:self];
}
5.在控制器中設置代理人,實現代理方法
不要忘了在控制器中添加協議,UIImageView 一定要開交互

三.手勢識別器 UIGestureRecognizer,抽象類
1.輕拍 tap
2.長按 longPress
3.旋轉 roration
4.捏合 pinch
5.平移 pan
6.輕掃 swipe(左掃,右掃)需要設置左右掃的方向
7.屏幕邊緣掃 ScreenEdgePan 繼承平移 同樣需要設置 從屏幕哪個邊緣掃
這7個手勢都是可以添加響應方法的.

有一個重要的屬性,取出被添加視圖 例:tag.view
長按需要判斷一個狀態 長按只需要觸發一次
旋轉 需要形變屬性 oration.view.transform = CGAffineTransformRotate(roration.view.transform, roration.rotation); 參數一 要改變形變屬性的視圖 參數二 根據弧度去創建 每次轉需要把旋轉的角度重置爲0 因爲要接替上一次的角度 開始旋轉

捏合: pinch.view.transform = CGAffineTransformScale(pinch.view.transform, pinch.scale, pinch.scale); 根據縮放的刻度(比例)改變形變屬性 根據手勢捏合的比例 去改變形變屬性 同樣需要重置捏合比例. pinch.scale = 1;

平移: 獲取平移的點(相當於要平移的視圖) CGPoint p = [pan translationInView:pan.view]; 根據這個點改變形變屬性 pan.view.transform = CGAffineTransformTranslate(pan.view.transform, p.x, p.y);
重置這個點 setTranslation:CGpoint inView: view

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章