預備知識
iOS處理螢幕上的觸摸動作,主要涉及到以下幾個方法:
touchesBegan:withEvent: //觸控螢幕幕的最開始被調用
touchesMoved:withEvent: //移動過程中被調用
touchesEnded:withEvent: //動作結束時被調用
touchesCancelled:WithEvent:
從方法的命名可以清晰的看出該方法何時被調用,最後一個比較特殊。touchesCancelled:WithEvent:在Cocoa Touch必須響應持續觸摸事件的系統中斷時調用。
我們只要重寫這些方法,來作我們想要作的事情就可以了。
如何?拖動視圖?1.設定userInteractionEnabled屬性為YES,允許使用者互動。2.在觸摸動作開始時記錄起始點。3.在移動過程中,計算當前位置座標與起始點的差值,即位移量,並且行動裝置檢視中心點至位移量大小的地方。4.分別限制x座標、與y座標,保證使用者不可將視圖托出螢幕備忘:分別限制x座標與y座標的原因是,即使向右拖動不了了,仍需保證可以向下拖動。實現代碼以子類化UIImageView為例
#import <UIKit/UIKit.h>@interface GragView : UIImageView{ CGPoint startPoint;}@end
#import "GragView.h"@implementation GragView- (id)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { // Initialization code //允許使用者互動 self.userInteractionEnabled = YES; } return self;}- (id)initWithImage:(UIImage *)image{ self = [super initWithImage:image]; if (self) { //允許使用者互動 self.userInteractionEnabled = YES; } return self;}- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ //儲存觸摸起始點位置 CGPoint point = [[touches anyObject] locationInView:self]; startPoint = point; //該view置於最前 [[self superview] bringSubviewToFront:self];}-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ //計算位移=當前位置-起始位置 CGPoint point = [[touches anyObject] locationInView:self]; float dx = point.x - startPoint.x; float dy = point.y - startPoint.y; //計算移動後的view中心點 CGPoint newcenter = CGPointMake(self.center.x + dx, self.center.y + dy); /* 限制使用者不可將視圖托出螢幕 */ float halfx = CGRectGetMidX(self.bounds); //x座標左邊界 newcenter.x = MAX(halfx, newcenter.x); //x座標右邊界 newcenter.x = MIN(self.superview.bounds.size.width - halfx, newcenter.x); //y座標同理 float halfy = CGRectGetMidY(self.bounds); newcenter.y = MAX(halfy, newcenter.y); newcenter.y = MIN(self.superview.bounds.size.height - halfy, newcenter.y); //移動view self.center = newcenter;}/*// Only override drawRect: if you perform custom drawing.// An empty implementation adversely affects performance during animation.- (void)drawRect:(CGRect)rect{ // Drawing code}*/@end