ios觸摸事件案例

前言:ios事件之觸摸事件詳解請?zhí)D(zhuǎn)http://www.reibang.com/p/1c355a7264b5
創(chuàng)建畫布畫線條
1骤铃、創(chuàng)建模型對象并聲明CGPoint屬性

.h文件
@interface TouchLine : NSObject
/*起點(diǎn)*/
@property(nonatomic,assign)CGPoint  begin;
/*終點(diǎn)*/
@property(nonatomic,assign)CGPoint  end;

@end

.m文件
@implementation TouchLine

@synthesize begin,end;

@end

2、自定義視圖情组,創(chuàng)建TouchDrawView類暖夭,繼承于UIView

.h文件
@interface TouchDrawView : UIView{
    //存儲key值
    NSMutableDictionary *lineInProcess_Dic;
    //存儲key對應(yīng)的值
    NSMutableArray *completeline_Arr;
}

/*清理*/
-(void)clearAll;

.m文件
@implementation TouchDrawView

-(id)initWithFrame:(CGRect)frame{
    self=[super initWithFrame:frame];
    if (self) {
        //初始化
        lineInProcess_Dic=[[NSMutableDictionary alloc]init];
        completeline_Arr=[[NSMutableArray alloc]init];
        [self setBackgroundColor:[UIColor whiteColor]];
        //開啟多點(diǎn)觸摸事件,默認(rèn)為NO
        [self setMultipleTouchEnabled:YES];
    }
    return self;
}

/*C函數(shù)繪制線條*/
-(void)drawRect:(CGRect)rect{
    //設(shè)置上下文
    CGContextRef context=UIGraphicsGetCurrentContext();
    //設(shè)置線寬
    CGContextSetLineWidth(context, 10.0);
    //設(shè)置線條終點(diǎn)形狀
    CGContextSetLineCap(context, kCGLineCapRound);//kCGLineCapRound屬性值指定繪制圓形端點(diǎn)两芳, 線條結(jié)尾處繪制一個直徑為線條寬度的半圓
    //設(shè)置當(dāng)前繪圖上下文中的填充和筆劃顏色(已經(jīng)完成的線條)
    [[UIColor blackColor]set];
    for (TouchLine *line in completeline_Arr) {
        //開始畫線
        CGContextMoveToPoint(context, [line begin].x, [line begin].y);
        //畫直線
        CGContextAddLineToPoint(context, [line end].x, [line end].y);
        //沿著路徑畫線
        CGContextStrokePath(context);
    }
    
    //設(shè)置當(dāng)前繪圖上下文中的填充和筆劃顏色(正在畫的線條)
    [[UIColor redColor]set];
    for (NSValue *value in lineInProcess_Dic) {
        TouchLine *line = [lineInProcess_Dic objectForKey:value];
        //開始畫線
        CGContextMoveToPoint(context, [line begin].x, [line begin].y);
        //畫直線
        CGContextAddLineToPoint(context, [line end].x, [line end].y);
        //沿著路徑畫線
        CGContextStrokePath(context);
    }
    
}

-(void)clearAll{
    [lineInProcess_Dic removeAllObjects];
    [completeline_Arr removeAllObjects];
    //重畫
    [self setNeedsDisplay];
}


//一根手指或多根手指觸摸屏幕
- (void)touchesBegan:(NSSet *)touches withEvent:(nullable UIEvent *)event{
    for (UITouch *touch in touches) {
        //連按
        if ([touch tapCount]>1) {
            [self clearAll];
            return;
        }
        //封裝UITouch對象地址至value_key中
        NSValue *value_key = [NSValue valueWithNonretainedObject:touch];
        //根據(jù)觸摸位置創(chuàng)建對象
        CGPoint locat = [touch locationInView:self];
        TouchLine *line = [[TouchLine alloc]init];
        [line setBegin:locat];
        [line setEnd:locat];
        //將鍵-值對保存至字典中
        [lineInProcess_Dic setObject:line forKey:value_key];
    }
}

//一根手指或多根手指在屏幕上移動(隨著手指的移動摔寨,相關(guān)的對象會持續(xù)發(fā)送該消息)
- (void)touchesMoved:(NSSet *)touches withEvent:(nullable UIEvent *)event{
    //根據(jù)傳入的UITouch對象,更新lineInProcess_Dic
    for (UITouch *touch in touches) {
        //取出當(dāng)前對應(yīng)UITouch對象的TouchLine對象
        NSValue *value_key = [NSValue valueWithNonretainedObject:touch];
        TouchLine *line = [lineInProcess_Dic objectForKey:value_key];
        //更新TouchLine對象
        CGPoint locat = [touch locationInView:self];
        [line setEnd:locat];
    }
    //重畫
    [self setNeedsDisplay];
}

//提取的公共方法
-(void)endTouches:(NSSet *)touches{
    //將已經(jīng)完成的TouchLine對象移除
    for (UITouch *touch in touches) {
        //取出當(dāng)前對應(yīng)UITouch對象的TouchLine對象
        NSValue *value_key = [NSValue valueWithNonretainedObject:touch];
        TouchLine *line = [lineInProcess_Dic objectForKey:value_key];
        //如果是連按怖辆,則line值為nil是复,所以先判斷,避免nil加入數(shù)組
        if (line) {
            [completeline_Arr addObject:line];
            [lineInProcess_Dic removeObjectForKey:value_key];
        }
    }
    //重畫
    [self setNeedsDisplay];
}

//一根手指或多根手指離開屏幕
- (void)touchesEnded:(NSSet *)touches withEvent:(nullable UIEvent *)event{
    [self endTouches:touches];
}

//在觸摸操作正常結(jié)束前疗隶,某個系統(tǒng)事件(如有電話打進(jìn)來)打斷了觸摸過程
- (void)touchesCancelled:(NSSet *)touches withEvent:(nullable UIEvent *)event{
    [self endTouches:touches];
}

//3D 觸摸事件
- (void)touchesEstimatedPropertiesUpdated:(NSSet *)touches NS_AVAILABLE_IOS(9_1){
    NSLog(@"暫時沒找到使用的方法案例");
}

3佑笋、在UIViewController的.m文件中調(diào)用

@implementation TouchVC

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.title=@"觸摸事件";
    TouchDrawView *touchView = [[TouchDrawView alloc]initWithFrame:CGRectMake(0,0,SCREEN_WIDTH,SCREEN_HEIGHT)];
    [self.view addSubview:touchView];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市斑鼻,隨后出現(xiàn)的幾起案子蒋纬,更是在濱河造成了極大的恐慌,老刑警劉巖坚弱,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜀备,死亡現(xiàn)場離奇詭異,居然都是意外死亡荒叶,警方通過查閱死者的電腦和手機(jī)碾阁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來些楣,“玉大人脂凶,你說我怎么就攤上這事〕钭拢” “怎么了蚕钦?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鹅很。 經(jīng)常有香客問我嘶居,道長,這世上最難降的妖魔是什么促煮? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任邮屁,我火速辦了婚禮整袁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘佑吝。我一直安慰自己坐昙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布迹蛤。 她就那樣靜靜地躺著民珍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盗飒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天陋桂,我揣著相機(jī)與錄音逆趣,去河邊找鬼。 笑死嗜历,一個胖子當(dāng)著我的面吹牛宣渗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梨州,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼痕囱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了暴匠?” 一聲冷哼從身側(cè)響起鞍恢,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎每窖,沒想到半個月后帮掉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窒典,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年蟆炊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瀑志。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡涩搓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出劈猪,到底是詐尸還是另有隱情昧甘,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布岸霹,位于F島的核電站疾层,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贡避。R本人自食惡果不足惜痛黎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一予弧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧湖饱,春花似錦掖蛤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仅仆,卻和暖如春器赞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背墓拜。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工港柜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咳榜。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓夏醉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涌韩。 傳聞我的和親對象是個殘疾皇子畔柔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361