閱讀673 返回首頁    go 阿裏雲 go 技術社區[雲棲]


IOS各種手勢的使用

#import "HYBRootViewController.h"

@interface HYBRootViewController () <UIGestureRecognizerDelegate>

@property (nonatomic, retain) UIImageView *imageView;

- (void)imageViewTap:(UITapGestureRecognizer *)sender;

@end

@implementation HYBRootViewController

@synthesize imageView = _imageView;

- (void)viewDidLoad {
  [super viewDidLoad];
  
  self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];
  self.imageView.image = [UIImage imageNamed:@"1.png"];
  self.imageView.userInteractionEnabled = YES; // Default is NO
  [self.view addSubview:self.imageView];
  
  // 添加點擊手勢
  // 所有手勢的父類 UIGestureReconizer
  UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                                 initWithTarget:self action:@selector(imageViewTap:)];
  //tap.numberOfTapsRequired = 2; // 要求雙擊才觸發事件
  tap.numberOfTouchesRequired = 2; // 要求兩個手指同時觸摸才觸發事件
  // 將點擊手勢添加到imageView上
  [self.imageView addGestureRecognizer:tap];
  tap.delegate = self;
  [tap release];
  
  //
  // 添加移動手勢
  UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]
                                 initWithTarget:self action:@selector(imageViewPaned:)];
  [self.imageView addGestureRecognizer:pan];
  pan.delegate = self;
  [pan release];
  
  //
  // 添加縮放手勢
  UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]
                                   initWithTarget:self action:@selector(imageViewPinched:)];
  [self.imageView addGestureRecognizer:pinch];
  pinch.delegate = self;
  [pinch release];
  
  // 旋轉手勢
  UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc]
                                           initWithTarget:self action:@selector(imageViewRotated:)];
  [self.imageView addGestureRecognizer:rotation];
  rotation.delegate = self;
  [rotation release];
  
	return;
}

- (void)dealloc {
  self.imageView = nil;
  
  [super dealloc];
  return;
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  return;
}

- (void)imageViewTap:(UITapGestureRecognizer *)sender {
  self.view.backgroundColor = [UIColor greenColor];
  return;
}

// 此方法在移動過程中時時調用
// 移動手勢
- (void)imageViewPaned:(UIPanGestureRecognizer *)sender {
  NSLog(@"paned");
  // 這個view是這個移動手勢被回到的視圖上的view,這裏就是self.imageView
  //sender.view
  // 拿到父 視圖imageView被點擊的點在Self.view上的位置
  CGPoint pt = [sender translationInView:self.view];

  sender.view.center = CGPointMake(sender.view.center.x + pt.x, sender.view.center.y + pt.y);
  // 重置手勢獲取的偏移量
  // 這一步很重要
  [sender setTranslation:CGPointZero inView:self.view];
  
  return;
}

// 縮放手勢
// 此方法在縮放過程中會被調用多次
- (void)imageViewPinched:(UIPinchGestureRecognizer *)sender {
  // 很重要的一個屬性scale,會被捕獲到縮放的倍數
  // 參數一:原來的transform
  // 參數二:水平方向縮放的倍數
  // 參數三:垂直方向縮放的倍數
  // CGAffineTansform 仿射變換矩陣(矩陣中放置view的縮放倍數,旋轉角度,x,y坐標等參數)
  // 將x,y方向的縮放倍數傳給transform
  sender.view.transform = CGAffineTransformScale(sender.view.transform, sender.scale, sender.scale);
  // 會被多次調用這個方法,所以每次都要重置縮放倍數為原始倍數
  sender.scale = 1.0f;

  return;
}

// 旋轉手勢
- (void)imageViewRotated:(UIRotationGestureRecognizer *)sender {
  // 改變矩陣的角度參數
  sender.view.transform = CGAffineTransformRotate(sender.view.transform, sender.rotation);
  // 重置角度,因為在這個方法在旋轉時會時時被調用
  sender.rotation = 0.0f;
  return;
}

// 設置同時可以有兩個手勢同時識別
// 基本上是同時識別兩個,默認為NO
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
  shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
  return YES;
}

@end

最後更新:2017-04-03 12:56:18

  上一篇:go 自定義控件讓TextView、Button的drawableLeft和drawableRight與文本一起居中顯示
  下一篇:go 重振旗鼓