苹果开发 笔记(11)UITouch
来源:互联网 发布:特效拍摄软件下载 编辑:程序博客网 时间:2024/05/18 15:52
今天早上看了一下触摸,之前也了解了一下,想起前几年Air出来的时候7yue也写过类似一个触摸画图的案例。今天实现了一个拖动的方块的案例。本身而言写这个目的是了解一下这个触摸是什么回事。从继承关系来讲是UIView 继承了UIResponder 响应类。UIResponder里面有下面关于触摸的方法 ,每一个触摸方法都有UIEvent 和UITouch集合对象的参数,底层里面已经处理了通知到对于的入口里面。只要在里面实现它就可以完成一个触摸动作。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
下面写一个测试,首先创建一个MyView类,这个类直接继承UIView类,并添加两个属性,分别记录触摸的点和中心点。
#import <Foundation/Foundation.h>#import <UIKit/UIKit.h>@interface MyView : UIView@property (nonatomic) CGPoint point;@property (nonatomic) CGPoint originalPoint;@end
接下来,实现四个方法行为。为每一个行为添加不同的方法。当触摸首次发生的时候,会响应toucheBegan的方法。该方法参数当中含有一个集合,集合里面包含UITouch对象。这个对象帮我们处理工作。有了它的帮助,我们可以在它里面的方法
-(CGPoint)locationInView:(UIView *) view ;获取返回的点。有了它的出现就可以知道第一次触摸该点的数据。这个不难理解,手指触摸了 ,而当下的触摸对象处理了帮我们记录的相应的位置点。
触发首次后,当我们产生移动的时候就会触发下面的方法,有了它就可以计算出拖动后的位移。
- (void)touchesMoved:(NSSet )touches withEvent:(UIEvent )event
基本计算方法,移动后的位置 减去上点的位置 +原本的中心。这样图形就移动起来。
同理 结束触摸后,手指松开了该结束方法也相应结束了。
#import "MyView.h"@implementation MyView- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ self.point = [[touches anyObject] locationInView:self.superview]; self.originalPoint = self.center; NSLog(@"中心点%@",NSStringFromCGPoint(self.center));}- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ CGPoint p = [[touches anyObject] locationInView:self.superview]; CGFloat dx = p.x - self.point.x; CGFloat dy = p.y - self.point.y; self.center = CGPointMake(dx+self.originalPoint.x, dy+self.originalPoint.y); self.point = [[touches anyObject] locationInView:self.superview]; self.originalPoint = self.center;}- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ self.point = [[touches anyObject] locationInView:self.superview]; self.originalPoint = self.center; //self.frame = CGRectMake(self.point.x, self.point.y, self.frame.size.width, self.frame.size.width);//;CGself.point;}- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{ NSLog(@"触摸取消了");}@end
接下来,我们在Single View Apllication 的ViewController 里面去实例化MyView 对象。@interface ViewController ()@property (nonatomic,strong) MyView *subView;@end
self.subView = [[MyView alloc]init]; self.subView.frame =(CGRect){50,50,50,50}; self.subView.backgroundColor =[UIColor greenColor]; [self.view addSubview:self.subView];
最后运行测试
早上遇到一个调试小问题,NSLog怎样输出结构体的内容?突然对NSLog有一番的不理解。
我想当然以为这样子就可以处理了,当xcode 发出警告的时候,我就蒙住了。
NSLog(@"中心点%@",self.center);
结构体输出还有一些陪衬的方法,第一次接触有点别扭。一个不就好了,非得搞那么多转换?
NSLog(@"中心点%@",NSStringFromCGPoint(self.center));
引用了下面的方法代码,不知道是不是记那么多。
UIKIT_EXTERN NSString *NSStringFromCGPoint(CGPoint point);
UIKIT_EXTERN NSString *NSStringFromCGVector(CGVector vector);
UIKIT_EXTERN NSString *NSStringFromCGSize(CGSize size); UIKIT_EXTERN
NSString *NSStringFromCGRect(CGRect rect); UIKIT_EXTERN NSString
*NSStringFromCGAffineTransform(CGAffineTransform transform); UIKIT_EXTERN NSString *NSStringFromUIEdgeInsets(UIEdgeInsets insets);
UIKIT_EXTERN NSString *NSStringFromUIOffset(UIOffset offset);
今天发现触摸还要很多深入的地方。UIView 这个基础类 有动画的关联,有层的关联,有事件关联,有触摸的关联,有绘图方面的关联。想想一下UIView这个基类 承担的责任真大。
- 苹果开发 笔记(11)UITouch
- 苹果开发 笔记(1)
- 苹果开发 笔记(2)
- 苹果开发 笔记(3)
- 苹果开发 笔记(4)
- 苹果开发 笔记(9)
- 苹果开发 笔记(10)
- 苹果开发 笔记(13)
- 苹果开发 笔记(14)
- 苹果开发 笔记(15)
- 苹果开发 笔记(16)
- 苹果开发 笔记(17)
- 苹果开发 笔记(18)
- 苹果开发 笔记(19)
- 苹果开发 笔记(20)
- 苹果开发 笔记(21)
- 苹果开发 笔记(22)
- 苹果开发 笔记(23)
- 用JavaScript获取伪元素(Pseudo-Element)属性的方法
- Mysql 常用命令
- MAC下使用adb连接android手机
- Java中native关键字 JNI
- Macbook 更改终端个性化设置
- 苹果开发 笔记(11)UITouch
- C++primer 学习1.2 --1.3初识输入和输出
- ViewDragHelper详解
- adb 启动错误
- MySQL 存储过程/游标/事务
- 使用Amoeba for mysql实现mysql读写分离
- Python字符类型
- 找出数组相同元素
- DatePickerDialog 时间范围的设置方法(setMaxDate,setMinDate)