您的位置:首页 > 产品设计 > UI/UE

iOS开发之UI手势

2016-09-19 16:03 288 查看
基础手势

@property (nonatomic,strong)UIImageView *imageView;

//该方法是一个懒加载,在需要的地方才调用,节省内存
- (UIImageView *)imageView{//方法名要与属性相同
if (!_imageView) {
_imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 70, self.view.bounds.size.width-40, self.view.bounds.size.height/2)];
_imageView.image = [UIImage imageNamed:@"1.jpg"];
}
return _imageView;
}

- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.imageView];//此处相当于调用了懒加载方法

//开启交互事件的响应,默认为NO
_imageView.userInteractionEnabled = YES;
//添加手势对象
/**
UITapGestureRecognizer 点按手势

参数1:响应事件拥有者,self表示当前视图控制器
参数2:响应事件方法,tapOneAction:
*/
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOneAction:)];
//表示识别事件的类型:几次点击触发,默认值是1
tapGesture.numberOfTapsRequired = 1;
//几个手指点击时触发事件
tapGesture.numberOfTouchesRequired = 1;
//把手势添加到视图里面,视图可以响应事件
[_imageView addGestureRecognizer:tapGesture];

//添加双击手势
UITapGestureRecognizer *tapGesture2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTwoAction:)];
tapGesture2.numberOfTapsRequired = 2;//点击两次才触发事件
tapGesture2.numberOfTouchesRequired = 1;
[_imageView addGestureRecognizer:tapGesture2];

//当单击操作遇到双击操作的时候,使单击操作失败(tapGesture)
[tapGesture requireGestureRecognizerToFail:tapGesture2];
}

//单击事件响应方法,这里使图片放大,即改变imageView的frame
- (void)tapOneAction:(UITapGestureRecognizer *)gesture{
NSLog(@"单击");
//获取手势监控的视图,在该imageView外面不能触发
UIImageView *imageView = (UIImageView *)gesture.view;
//开始动画
[UIView beginAnimations:nil context:nil];
//设置动画时间
[UIView setAnimationDuration:2];
//放大图片
imageView.frame = self.view.bounds;
}

//双击事件响应方法,这里使图片缩小为原来的大小
- (void)tapTwoAction:(UITapGestureRecognizer *)gesture{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2];
//设置_imageView为初始的frame
_imageView.frame = CGRectMake(20, 70, self.view.bounds.size.width-40, self.view.bounds.size.height/2);
//提交动画
[UIView commitAnimations];
}


高级手势

#import "ViewController.h"

@interface ViewController ()<UIGestureRecognizerDelegate>
//UIGestureRecognizerDelegate 同时进行旋转、缩放的协议

@property (nonatomic,strong)UIImageView *imageView;

//定义一个缩放手势手势,用来对视图进行放大缩小
//捏合手势
@property (nonatomic,strong)UIPinchGestureRecognizer *pinGesture;
//旋转手势
@property (nonatomic,strong)UIRotationGestureRecognizer *rotationGesture;

@end

@implementation ViewController
//懒加载
- (UIImageView *)imageView {
if (!_imageView) {
_imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 70, self.view.bounds.size.width-40, self.view.bounds.size.height/2)];
_imageView.image = [UIImage imageNamed:@"2.jpg"];

}
return _imageVi
4000
ew;
}

- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.imageView];
//开启交互
_imageView.userInteractionEnabled = YES;
//创建一个捏合手势
_pinGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinGesture:)];
[_imageView addGestureRecognizer:_pinGesture];
//创建一个旋转手势
_rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationAction:)];
[_imageView addGestureRecognizer:_rotationGesture];

//设置两种手势的代理为self
_pinGesture.delegate = self;
_rotationGesture.delegate = self;
}

//实现协议的方法
//是否可以同时响应两个手势
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {//Simultaneously 同时的
//如果返回YES,可以同时响应
return YES;
}

- (void)pinGesture:(UIPinchGestureRecognizer *)gesture {
//获取监控图像视图
UIImageView *imgView = (UIImageView *)gesture.view;

//对图像视图对象进行矩阵计算并且赋值
//transform:表示图像学中的变换矩阵
//CGAffineTransformScale:通过缩放产生一个新的矩阵(在原来的基础上)
//p1:原来的矩阵
//p2:x方向缩放的比例
//p3:y方向缩放的比例
imgView.transform = CGAffineTransformScale(imgView.transform, gesture.scale, gesture.scale);
//返回的是新的缩放之后变化矩阵的比例
gesture.scale = 1;
}

- (void)rotationAction:(UIRotationGestureRecognizer *)rotationGesture {
//获取监控图像视图
UIImageView *imgView = (UIImageView *)rotationGesture.view;
imgView.transform = CGAffineTransformRotate(imgView.transform, rotationGesture.rotation);
//对角度进行清零
rotationGesture.rotation = 0;
}


扩展手势

@interface ViewController ()<UINavigationControllerDelegate, UIImagePickerControllerDelegate>

@property (nonatomic,strong)UIImageView *imageView;

@end

@implementation ViewController

- (UIImageView *)imageView {
if (!_imageView) {
_imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 70, self.view.bounds.size.width-40, self.view.bounds.size.height/2)];
_imageView.image = [UIImage imageNamed:@"2.jpg"];

}
return _imageView;
}

- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.imageView];
_imageView.userInteractionEnabled = YES;

//创建一个平移手势
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];
//添加手势
[_imageView addGestureRecognizer:panGesture];

//创建一个轻扫手势
UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeAction:)];
swipeGesture.direction = UISwipeGestureRecognizerDirectionUp;
[_imageView addGestureRecognizer:swipeGesture];

//创建一个长按手势
UILongPressGestureRecognizer *longGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longAction:)];
//设置长按手势的时间,默认0.5秒为长按手势
longGesture.minimumPressDuration = 1.0;
[_imageView addGestureRecognizer:longGesture];
}

//平移手势
//只要手指在屏幕坐标上发生变化的时候就会调用该方法
- (void)panAction:(UIPanGestureRecognizer *)panGesture {
//    NSLog(@"平移手势");
//    //获得移动的坐标,相对于视图的坐标系
CGPoint point = [panGesture translationInView:self.view];//translation 平移
_imageView.center = CGPointMake(_imageView.center.x + point.x, _imageView.center.y + point.y);
//在指定视图的坐标系中设置平移值
[panGesture setTranslation:CGPointZero inView:self.view];
//    NSLog(@"point.x = %f,point.y = %f",point.x,point.y);
//    //获取平移时的相对速度(每秒在屏幕上滑动移动像素的值)
CGPoint pv = [panGesture velocityInView:self.view];
//    NSLog(@"pv.x = %.2f,pv.y = %.2f",pv.x,pv.y);

}

//轻扫手势
- (void)swipeAction:(UISwipeGestureRecognizer *)swipeGesture {
NSLog(@"向上");
}

//长按手势
- (void)longAction:(UILongPressGestureRecognizer *)longGesture {
if (longGesture.state == UIGestureRecognizerStateBegan) {
NSLog(@"开始状态");

UIAlertController *alertC = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"保存到相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"保存到相册");
UIImageWriteToSavedPhotosAlbum(_imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}];
[alertC addAction:action1];
UIAlertAction *action2 = [UIAlertAction actionWithTitle:@"打开相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"打开相册");
/**
sourceType:
UIImagePickerControllerSourceTypePhotoLibrary,    图片列表
UIImagePickerControllerSourceTypeCamera,          摄像头
UIImagePickerControllerSourceTypeSavedPhotosAlbum 相册
*/
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
//资源类型
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
picker.delegate = self;
//选择图片后是否可以被编辑
picker.allowsEditing = YES;
//推送picker控制器
[self presentViewController:picker animated:YES completion:nil];

}];
[alertC addAction:action2];
UIAlertAction *action3 = [UIAlertAction actionWithTitle:@"打开相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"打开相机");
//要使用真机来测试
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIBarButtonSystemItemCamera;
picker.delegate = self;
picker.allowsEditing = YES;
[self presentViewController:picker animated:YES completion:nil];

}];
[alertC addAction:action3];
UIAlertAction *action4 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"取消");
}];
[alertC addAction:action4];
//推出alertC!!
[self presentViewController:alertC animated:YES completion:^{

}];

}
else if (longGesture.state == UIGestureRecognizerStateEnded){
NSLog(@"结束状态");
}

NSLog(@"长按");
}

//保存图片方法
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
if (!error) {
NSLog(@"图片保存成功");
}
else {
NSLog(@"图片保存失败");
}
}

#pragma mark --UIImagePickerControllerDelegate--
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {

if (picker.sourceType == UIImagePickerControllerSourceTypePhotoLibrary) {

NSLog(@"%@",info);
//照片的原始数据
_imageView.image = info[UIImagePickerControllerOriginalImage];
//退出picker!!!
}
else if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
_imageView.image = info[UIImagePickerControllerOriginalImage];
}
[picker dismissViewControllerAnimated:YES completion:nil];
}

//- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
//
//    NSLog(@"取消");
//}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios开发 手势