最近開始學習IOS的開發,師兄給我提出一個需求:實現一個可拖動的轉盤。師兄提示我說利用touch event和UIView animation。通過一兩天的折騰邊學邊作,算是實現了基本功能。這裏寫寫加深本身的印象。學習
要求是這樣的:在屏幕上顯示一個圓盤,若是沒有干擾的時候勻速轉動,當手指觸碰屏幕的時候轉盤要跟隨手指的運動而轉動。個人思路是這樣的:用一個NSTimer來控制轉盤(UIImageView),每隔一段時間調用一個轉動的動畫(每次轉動一個小角度),這樣就能夠達到勻速轉動的效果。動畫用UIView animation 來實現,在animation裏面經過設置Trasform屬性來轉動。動畫
勻速轉動的問題解決了,接下來就要解決響應手勢的問題。google了一下發現了GestureRecognizer類,因而開始採用TapGestureRecognizer,SwipeGestureRecognizer,和PanGestureRecognizer來響應手指的運動。Tap對應點擊,Swipe對應在屏幕上的滑動,pan則對應拖動的動做。我在imageView上面添加了這幾個GestureRecognizer,而後爲每個Recognizer編寫對應的處理事件。而後我遇到了幾個問題,一個是事件沒法按照個人預期去響應,尤爲是拖動,根本一塌糊塗。還有一個就是,我對於如何使用PanGestureRecognizer沒有思路。後來問問師兄,師兄提醒說試試UIView 的touch event,因此我就開始了新的摸索。google
看了一下資料之後發現其實用touch event處理更簡潔,使用touch event要覆蓋UIView的四個方法:orm
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;對象
手指剛剛觸摸屏幕的時候觸發的事件事件
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;ip
手指在屏幕上移動是會不斷觸發這個事件開發
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;get
手指離開後觸發的事件animation
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
觸摸正常結束前,某個系統事件(例若有電話打進來)打斷了觸摸過程
在這是時間裏面都有一個對象NSSet,這個set裏面包含了一組UITouch對象至少一個,而每個就對應這個一個手指的狀態,也就是說touch event是能夠同時記錄多個手指觸摸的狀態的。UITouch 裏面記錄了當前屏幕被觸摸的位置,有了這個就能夠實現以前說到的拖動功能了。
大致思路是這樣的,當touch開始時會觸發touchesBegan事件,在這裏面我記錄下開始的位置startPoint,而後手指移動之後會觸發touchesMoved事件,在這個事件裏面獲得當前位置endPoint,這樣的話就獲得了兩個點再加上view的中心center就有了三個點,三個點構成的兩條直線line1(startPoint,center) line2(endPoint,center),求出兩條直線的夾角就能夠知道須要轉動的角度了。得出角度之後再用兩條直線的到角肯定轉到的方向(順時針,逆時針)。每一次轉動後startPoint=endPoint繼續move,直到touchesEnded就是最後的位置了。難點主要是數值計算,比較麻煩,要注意斜率不存在的狀況。還有一個要注意的就是精度問題,當startPoint和endPoint相差很小的時候我是不處理的,設定一個伐值,當兩點之間的距離大於必定值時才進行轉動。避免了float因爲數值過小致使的精度丟失,以及沒必要要的微小運動。
IOS學習筆記,歡迎指正錯誤。XCode項目代碼:http://pan.baidu.com/share/link?shareid=2625688121&uk=4245725234