苹果开发 笔记(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这个基类 承担的责任真大。

0 0