IOS的处理touch事件处理(按照手指的移动移动一个圆,开发环境用的ios7,storyboard)
先看下页面的效果图:
首先定义这个ball它有两个属性和两个方法:
@property(nonatomic)
CGPoint location;
@property(nonatomic)
CGFloat length;
-(CGPoint) getCenterPoint;
-(BOOL) isInTheBall:(CGPoint) point;
方法体是:
//找出ball的中心点
-(CGPoint) getCenterPoint { return CGPointMake((self.location.x+self.length/2), self.location.y+self.length/2);
}; //看点point是不是在ball的范围内
-(BOOL) isInTheBall:(CGPoint) point{
CGPoint center = self.getCenterPoint;
float t = (point.x - center.x) * (point.x - center.x);
float y = (point.y - center.y) * (point.y - center.y); float k = sqrtf(t+y);
if (k < self.length/2) {
return YES;
}else {
return NO;
}
};
定义BallView继承UIView
@property(nonatomic) Ball* ball;
@property(nonatomic) BOOL isTouch; //表示手指在ball的范围内移动
@property(nonatomic) CGPoint prePoint; //手指在进入move事件之前的那个点
- (id)initWithBall:(CGRect)frame aBall:(Ball*) ball; //初始化方法
初始化函数为:
- (id)initWithBall:(CGRect)frame aBall:(Ball*) ball
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.ball = ball;
}
return self;
} -(void)awakeFromNib{
self.backgroundColor = nil;
self.opaque = NO;
} // Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
[super drawRect:rect]; CGContextRef contextRef = UIGraphicsGetCurrentContext();
[[UIColor whiteColor] set]; //rect是整个view
CGContextFillRect(contextRef, rect); [[UIColor redColor] set]; //CGContextAddEllipseInRect不会填充圆圈的内部
// CGContextAddEllipseInRect(contextRef, CGRectMake(200.0f, 200.0f, 50.0f, 50.0f));
CGContextFillEllipseInRect(contextRef, CGRectMake(self.ball.location.x,self.ball.location.y,self.ball.length,self.ball.length)); CGContextStrokePath(contextRef);
}
我们在viewController里初始化仅仅要:
-(void) loadView{
[super loadView];
Ball* ball = [[Ball alloc] init];
ball.location = CGPointMake(200.0f, 100.0f);
ball.length = 80.0f;
BallView* view = [[BallView alloc] initWithBall:[UIScreen mainScreen].bounds aBall:ball];
[self.view addSubview:view];
}
然后在以下在BallView中进行事件处理
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"touchesBegan");
//以下两句知道手指在屏幕上的点的信息
UITouch* touch = [touches anyObject];
CGPoint point = [touch locationInView:self];
if ([self.ball isInTheBall:point]) {
self.isTouch = YES;
self.prePoint = point;
}else{
self.isTouch = NO;
}
NSLog(@"x=%f,y=%f",point.x,point.y);
}
-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"touchesMoved");
if (self.isTouch) {
CGRect preRect = CGRectMake(self.ball.location.x, self.ball.location.y, self.ball.length, self.ball.length);
//先用之前的location绘制一遍
[self setNeedsDisplayInRect:preRect];
UITouch* touch = [touches anyObject];
CGPoint point = [touch locationInView:self];
//cx和cy是手指的偏移量。用他们能够计算出新的location
float cx = point.x - self.prePoint.x;
float cy = point.y - self.prePoint.y;
self.ball.location = CGPointMake(self.ball.location.x + cx, self.ball.location.y+cy);
CGRect newRect = CGRectMake(self.ball.location.x, self.ball.location.y, self.ball.length, self.ball.length);
//用新的location绘制一遍
[self setNeedsDisplayInRect:newRect];
self.prePoint = point;
}
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"touchesEnded");
self.isTouch = NO;
}
IOS的处理touch事件处理(按照手指的移动移动一个圆,开发环境用的ios7,storyboard)的更多相关文章
- 【转】IOS的处理touch事件处理(依照手指的移动移动一个圆,开发环境用的ios7,storyboard)-- 不错
原文网址:http://blog.csdn.net/baidu_nod/article/details/32934565 先看下页面的效果图: 首先定义这个ball它有两个属性和两个方法: @prop ...
- ios学习笔记(一)Windows7上使用VMWare搭建iPhone开发环境(转)
原文地址:http://blog.csdn.net/shangyuan21/article/details/18153605 我们都知道开发iPhone等ios平台的移动应用时需要使用Mac本,但是M ...
- ios学习笔记(一)Windows7上使用VMWare搭建iPhone开发环境
我们都知道开发iPhone等ios平台的移动应用时需要使用Mac本,但是Mac本都比较昂贵,所以我们可以采用Windows7上利用VMWare安装Mac操作系统的方法来模拟ios开发环境,达到降低成本 ...
- Cocoa Touch事件处理流程--响应者链
Cocoa Touch事件处理流程--响应者链 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9264335 转载请注明 ...
- Android touch事件处理流程
前面我们看了key事件的处理流程,相信大家对此已经有了新的认识,这篇文章我打算带领大家来看看稍微复杂些的touch 事件的处理流程.说它复杂是因为key事件本身就key down,up,long pr ...
- Android的Touch事件处理机制
Android的Touch事件处理机制比较复杂,特别是在考虑了多点触摸以及事件拦截之后. Android的Touch事件处理分3个层面:Activity层,ViewGroup层,View层. 首先说一 ...
- 移动端的touch事件处理
简要的探讨一下移动端 touch 事件处理几个坑,以及相应的简单处理方法. click 穿透 假设有个弹出层,上面有个关闭的按钮支持 touchend 触发后关闭,若正好下方有个元素支持 click ...
- 自定义View系列教程06--详解View的Touch事件处理
深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...
- iOS开发教程之:iPhone开发环境搭建
安装条件: 硬件:一台拥有支持虚拟技术的64位双核处理器和2GB以上内存的PC. 注意:运行MAC OS,需要电脑支持虚拟技术(VT),安装时,需要将VT启动,在BIOS中开启. 软件: Window ...
随机推荐
- javascript 定义类(转载)
Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的extend或冒号,它也没有用来支持虚函数的virtual,不过,Javascript是一门 ...
- linux 多线程编程笔记
一, 线程基础知识 1,线程的概念 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行 中必不可少的资源(如程序计 ...
- Sightseeing Cows(最优比率环)
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8915 Accepted: 3000 ...
- http://blog.csdn.net/baimafujinji/article/details/10931621
书接上文,本文章是该系列的第二篇,按照总纲中给出的框架,本节介绍三个中值定理,包括它们的证明及几何意义.这三个中值定理是高等数学中非常基础的部分,如果读者对于高数的内容已经非常了解,大可跳过此部分.当 ...
- c 计算Fibonacci数列:1,1,2,3,5,8,13……这题也是很经典。
输出数字序列2/,/,/,/,/,/...,输出个数由键盘输入.注意输入使用scanf输入 比如: 输入 3输出为 / / / 输入 输出为 / / / / #include<stdio.h&g ...
- Leetcode解题记录
尽量抽空刷LeetCode,持续更新 刷题记录在github上面,https://github.com/Zering/LeetCode 2016-09-05 300. Longest Increasi ...
- 行列转换小结 Pivot ,Unpivot (转,改)
行专列 Pivot 1)SQL 2000版本 静态 SELECT ID , SUM(CASE Code WHEN 'Item1' THEN Value END) AS Item1 , SUM(CASE ...
- 分蛋糕(C - 二分查找)
分蛋糕 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/C Description My birthd ...
- JFreeChart画折线图
请见Github博客: http://wuxichen.github.io/Myblog/htmlcss/2014/09/01/JFreechartLinechart.html
- ASP.NET 内置对象涉略
一.ASP.NET中内置的常用对象的介绍 本文列举了ASP.NET 的八个内置对象,其中前五个是比较常用的. 1.Response Response 对象用于从服务器向用户发送输出的结果. Write ...