IOS 拖动视图

iOS处理屏幕上的触摸动作,主要涉及到以下几个方法:

touchesBegan:withEvent: //触摸屏幕的最开始被调用

touchesMoved:withEvent: //移动过程中被调用

touchesEnded:withEvent: //动作结束时被调用

touchesCancelled:WithEvent:

从方法的命名可以清晰的看出该方法何时被调用,最后一个比较特殊。touchesCancelled:WithEvent:在Cocoa Touch必须响应持续触摸事件的系统中断时调用。

我们只要重写这些方法,来作我们想要作的事情就可以了。

如何实现拖动视图?

1.设置userInteractionEnabled属性为YES,允许用户交互。

2.在触摸动作开始时记录起始点。

3.在移动过程中,计算当前位置坐标与起始点的差值,即偏移量,并且移动视图中心点至偏移量大小的地方。

4.分别限制x坐标、与y坐标,保证用户不可将视图托出屏幕

备注:分别限制x坐标与y坐标的原因是,即使向右拖动不了了,仍需保证可以向下拖动。

实现代码

以子类化UIImageView为例

[plain]

  1. #import<UIKit/UIKit.h>
  2.  
  3. @interfaceGragView:UIImageView
  4. {
  5. CGPointstartPoint;
  6. }
  7. @end


 

[plain]

  1. #import"GragView.h"
  2.  
  3. @implementationGragView
  4.  
  5. -(id)initWithFrame:(CGRect)frame
  6. {
  7. self=[superinitWithFrame:frame];
  8. if(self){
  9. //Initializationcode
  10. //允许用户交互
  11. self.userInteractionEnabled=YES;
  12. }
  13. returnself;
  14. }
  15.  
  16. -(id)initWithImage:(UIImage*)image
  17. {
  18. self=[superinitWithImage:image];
  19. if(self){
  20. //允许用户交互
  21. self.userInteractionEnabled=YES;
  22. }
  23. returnself;
  24. }
  25.  
  26. -(void)touchesBegan:(NSSet*)toucheswithEvent:(UIEvent*)event
  27. {
  28. //保存触摸起始点位置
  29. CGPointpoint=[[touchesanyObject]locationInView:self];
  30. startPoint=point;
  31.  
  32. //该view置于最前
  33. [[selfsuperview]bringSubviewToFront:self];
  34. }
  35.  
  36. -(void)touchesMoved:(NSSet*)toucheswithEvent:(UIEvent*)event
  37. {
  38. //计算位移=当前位置-起始位置
  39. CGPointpoint=[[touchesanyObject]locationInView:self];
  40. floatdx=point.x-startPoint.x;
  41. floatdy=point.y-startPoint.y;
  42.  
  43. //计算移动后的view中心点
  44. CGPointnewcenter=CGPointMake(self.center.x+dx,self.center.y+dy);
  45.  
  46.  
  47. /*限制用户不可将视图托出屏幕*/
  48. floathalfx=CGRectGetMidX(self.bounds);
  49. //x坐标左边界
  50. newcenter.x=MAX(halfx,newcenter.x);
  51. //x坐标右边界
  52. newcenter.x=MIN(self.superview.bounds.size.width-halfx,newcenter.x);
  53.  
  54. //y坐标同理
  55. floathalfy=CGRectGetMidY(self.bounds);
  56. newcenter.y=MAX(halfy,newcenter.y);
  57. newcenter.y=MIN(self.superview.bounds.size.height-halfy,newcenter.y);
  58.  
  59. //移动view
  60. self.center=newcenter;
  61. }
  62.  
  63. /*
  64. //OnlyoverridedrawRect:ifyouperformcustomdrawing.
  65. //Anemptyimplementationadverselyaffectsperformanceduringanimation.
  66. -(void)drawRect:(CGRect)rect
  67. {
  68. //Drawingcode
  69. }
  70. */
  71.  
  72. @end

效果图

猜你喜欢

转载自duchengjiu.iteye.com/blog/1867567