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
相关文章推荐
- BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
- iOS开发之路--微博“更多”页面
- Swift中实现点击、双击、捏、旋转、拖动、划动、长按手势的类和方法介绍
- 基于Android中手势交互的实现方法
- Android程序开发之给背景图加上移动的手势
- Android手势操作简单实例讲解
- 实例详解用户输入 i. 检测常用手势
- Android基础开发之手势识别
- Android应用开发中触摸屏手势识别的实现方法解析
- Android触摸及手势操作GestureDetector
- Android GestureDetector手势滑动使用实例讲解
- Android实现手势控制ImageView图片大小
- 基于JS实现Android,iOS一个手势动画效果
- iOS开发之路--微博骨架搭建
- iOS开发使用JSON解析网络数据
- IOS开发代码分享之获取启动画面图片的string
- 使用Swift代码实现iOS手势解锁、指纹解锁实例详解
- iOS开发实现音频播放功能
- iOS开发之视图切换
- IOS手势操作(拖动、捏合、旋转、点按、长按、轻扫、自定义)