iOS之手势与触摸

  触摸是iOS的交互核心,他不简单局限于“按下按钮”或“点击键盘”,还包括手势识别在内的一系列手势;

触摸#

  触摸包含以下信息:

  • 发生的地方
  • 处在哪个阶段(按下,移动,抬起)
  • 点击次数
  • 时间
      每个触摸操作及其信息都保存在UITouch对象里面,而这样一组UITouch对象则放在UIEvert对象里面传递。
    触摸的五个阶段:
    UITouchPhaseBegan---开始触碰
    UITouchPhaseMoved---移动
    UITouchPhaseStationary---从上个事件后仍在触碰但未移动
    UITouchPhaseEnded---结束触碰
    UITouchPhaseCancelled--不在追踪触碰
    UIResponder类中的触摸事件响应
  • touchesBagan: withEvent: --当开始触碰屏幕,系统会调用这个方法
  • touchesMoved: withEvent:--当触摸屏幕并持续移动时,系统会调用此方法
  • touchesEnded: withEvent:--触摸过程结束调用此方法
  • touchesCancelled: withEvent:--触摸阻断,系统调用方法

  这些方法通常需要UIView或者UIViewController来实现,相当于复写父类的方法。对视图的触摸涉及到响应链,这里有兴趣的朋友可以查查相关响应规则。
  另外iOS支出单点触摸(Single-Touch)和多点触摸(Multi-Touch);

手势识别器#

  这是苹果公司提供的一种强大的识别方式;你懂的!
iOS SDK内置的几种手势

  • 点击(tap)--一根或多个手指触碰;可以通过gestureRecongnizers属性来设定想要的点击次数
  • 滑动(swipe)--上下左右所作出的短距离单点触碰或者多点触碰,这种手势注意的是不能太超出主方向
  • 双指聚拢(pinch)--挤压或拉伸
  • 旋转(rotate)--两个手指顺时针或者逆时针移动,识别器会返回吧旋转的角度和速度返回给开发者
  • 拖动(pan)--拿手指在屏幕上作出拖拽的 动作,这里会识别到坐标的变化
  • 长按(long press)--这个不解释
     下面我们用代码演示如何用触碰和手势识别器分别实现拖拽功能:
@implementation DragView
{
CGPoint startLocation;
}
-(instancetype)initWithImage:(UIImage *)anImage
{
self=[super initWithImage:anImage];
if(self)
{
self.userInteractionEnabled=YES;
}
return self;
}
-(void)touchBegan:(NSSet *)touches withEvent:(UIEvent *)event{
startLocation =[[touches anyObject] locationInView:self];
[self.superview bringSubviewToFront:self];//让触摸的视图显示在屏幕最前方
}
-(void)touchMoved:(NSSet *)touches withEvent:(UIEvent *)event{
CGPiont pt=[[touches anyObject] locationInView:self];
float dx=pt.x-startLocation.x;
float dy=pt.y-startLocation.y;
CGPiont newcenter=CGPonitMake(
self.center.x+dx,self.center.y+dy);
self.center=newcenter;
}

 用手势识别器实现

@implementation DragView
{
CGPoint spreviousLocation;
}
-(instancetype)initWithImage:(UIImage *)anImage
{
self=[super initWithImage:anImage];
if(self)
{
self.userInteractionEnabled=YES;
UIPanGestureRecongnizer *panGesture=[[UIPanGestureRecongnizer alloc]initWithTarget:self action: @selector(handlePan:)];
self.gestureRecognizers=@[panGesture];
}
return self;
}
-(void)touchBegan:(NSSet *)touches withEvent:(UIEvent *)event{
spreviousLocation =self.center;
[self.superview bringSubviewToFront:self];//让触摸的视图显示在屏幕最前方
}
-(void)hanlePan:(UIPanGestureRecongnizer *)sender{
CGPoint tanslation=[sender translationInView:self,superview];
self.center=CGPonitMake(spreviousLocation.x+tanslation.x,spreviousLocation.y+tanslation.y);
}

你可能感兴趣的:(iOS之手势与触摸)