手势图的设计原理(1)

ViewController.m

/*

手势:
 UIResponder:是一个响应者(传达者) 用来响应 用户触摸屏幕的某些事件
 // 手指开始触摸屏幕调用
 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
 时间戳
 点击次数
 可以获得点击视图的位置*******
 - (CGPoint)locationInView:(nullable UIView *)view;
 
 // 手指触摸屏幕开始移动
 - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
 // 手指离开屏幕的时候调用
 - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
 // 手指因外部事件 取消触摸的时候调用
 - (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
 
 手势不调用  检查时候设置了背景颜色
 
 
 手势又分为六大手势:
 六大手势  全部都继承自  UIGestureRecognizer
 1、点击 UITapGestureRecognizer
 2、长按 UILongPressGestureRecognizer
 3、拖拽 UIPanGestureRecognizer
 4、捏合 UIPinchGestureRecognizer
 5、轻扫 UISwipeGestureRecognizer
 6、旋转 UIRotationGestureRecognizer
 
 touchesBegan moved end(鼠标开始、移动、结束)
 可以通过touches 获得某个触摸事件
 UITouch *touch = [touches anyObjects];
 可以通过UITouch 获得触摸的点的位置
 
 */
#import "ViewController.h"

@interface ViewController ()
{

UIImageView *imageView;
   
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

self.view.backgroundColor = [UIColor whiteColor];
    imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
    imageView.image = [UIImage imageNamed:@"fly_1"];
    [self.view addSubview:imageView];
   
    imageView.animationImages = @[[UIImage imageNamed:@"fly_1"],[UIImage imageNamed:@"fly_2"],[UIImage imageNamed:@"fly_3"],[UIImage imageNamed:@"fly_4"]];
    imageView.animationDuration = 1;
   
   
    //UIGestureRecognizer
    //初始化手势
    //- (instancetype)initWithTarget:(nullable id)target action:(nullable SEL)action;
    //UIView 中有添加手势的方法
    //addGestureRecognizer:
   
    //可以通过手势里面的view属性找到点击的视图
    //locationInView:找到点击的位置
   
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(actionOfTap:)];
   
    //设置手势点击的点击次数(才会移动)
    tap.numberOfTapsRequired = 2;
   
    //设置点击手指的个数
    //tap.numberOfTouchesRequired = 2;
    [self.view addGestureRecognizer:tap];
   
    //长按手势
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(actionOfLongPress:)];
    //设置长按的时间
    longPress.minimumPressDuration = 3;
    [self.view addGestureRecognizer:longPress];

}
/*
 typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
 UIGestureRecognizerStatePossible,  默认状态UIGestureRecognizerStateBegan,      手势开始
 UIGestureRecognizerStateChanged,    手势发生改变
 UIGestureRecognizerStateEnded,      手势结束
 UIGestureRecognizerStateCancelled,  手势被取消状态
 UIGestureRecognizerStateFailed, 手势失败的状态
 };
 */
//要想获得这些状态可以使用 state ->状态

//点击手势
-(void)actionOfTap:(UITapGestureRecognizer *)sender{

//    UIView *view = sender.view;
//    view.backgroundColor = [UIColor redColor];
   
    CGPoint point = [sender locationInView:self.view];
//    imageView.center = point;(已删除)
   
    //让视图从原始状态到animations里面的状态用2秒执行完
    //补间动画(只会让视图随着光标的点击而移动,不会变换他的大小形态)
//    [UIView animateWithDuration:2 animations:^{
//        imageView.center = point;
//    }];
   
    //不仅可以让视图随着光标的移动而移动,也可以在移动的途中和移动结束之后变换形态大小
    [UIView animateWithDuration:2 animations:^{
        imageView.center = point;
        imageView.bounds = CGRectMake(0, 0, 200, 200);
    } completion:^(BOOL finished) {
        //动画完成之后调用
         [UIView animateWithDuration:2 animations:^{
       
        imageView.bounds = CGRectMake(0, 0, 100, 100);
    }];//会从原始默认状态 到animations里面状态 用2秒钟执行完
   
    }];
    /*
     UIView动画
     系统帮咱们封装了 核心动画
    
     //设置动画的持续时间(Duratation)和动画
     [UIView animateWithDuration:1 animations:^{
    
     }];
    
     //completion 动画完成之后调用的方法
     [UIView animateWithDuration:1 animations:^{
    
     } completion:^(BOOL finished) {
    
     }];

*/
}
//长按实现方法
-(void)actionOfLongPress:(UILongPressGestureRecognizer *)sender{
   
    if (sender.state == UIGestureRecognizerStateBegan) {
        imageView.bounds = CGRectMake(0, 0, 200, 200);
        NSLog(@"放大了~");
    }
    if (sender.state == UIGestureRecognizerStateEnded) {
        imageView.bounds = CGRectMake(0, 0, 100, 100);
        NSLog(@"还原了~");
    }

}
//- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)even
//{
//    //locationInView:UITouch找到点击视图的某一个点
//    //anyObject 可以获得touches集合里面某一个touch事件
//    UITouch *touch = [touches anyObject];
//    //找到触摸视图上面的触摸点
//    CGPoint point = [touch locationInView:self.view];
//    NSLog(@"x:%f y:%f",point.x,point.y);
//   
//    //让图片随着鼠标光标的移动而移动
//    imageView.center = point;
//   
//    [imageView startAnimating];
//
//}
//
//// 手指触摸屏幕开始移动
//- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
//{
//    UITouch *touch = [touches anyObject];
//    CGPoint point  = [touch locationInView:self.view];
//    imageView.center = point;
//   
//
//}
//// 手指离开屏幕的时候调用
//- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
//{
//
//    [imageView stopAnimating];
//}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
   
    /*
     用户点击屏幕触发 -> 所有视图都继承UIResponder->UITuchBegin moved end
     UITuchBegin moved end
    
     1、获得点击的touch事件
     UITouch *touch = [touches anyObject]
     2、获得用户点击的位置
     CGPoint point = [touch locationInView:XX];
    
     UIGestureRecognizer:
     所有手势都是通过 初始化
     - (instancetype)initWithTarget:(nullable id)target action:(nullable SEL)action
    
     把手势添加到视图上
     [xx视图 addGestureRecognizer:xx手势];
    
     可以通过手势 获得触摸的视图
     view这个属性获得
    
     获得点击视图的位置
     CGPoint point = [xx手势 locationInView:xx视图];
    
    
     1、点击手势
     UITapGestureRecognizer
    
     numberOfTapsRequired: 设置点击的次数
     numberOfTouchesRequired: 设置点击手指的个数
    
     2、UILongPressGestureRecognizer
     minimumPressDuration: 设置长按的最小持续时间  会在长按的持续时间之后执行触发事件
    
     UIView动画
     在动画里面 更改视图的属性  产生动画效果
     [UIView animateWithDuration:时间 animations:^{
     要更改的属性 -> 会产生一个 在设置时间之后  执行完成的一个动画效果
     }];
    
    
     [UIView animateWithDuration:时间 animations:^{
     要更改的属性 -> 会产生一个 在设置时间之后  执行完成的一个动画效果
     } completion^(BOOL){
     当动画执行完毕之后调用
     }];
     */
}

@end

时间: 2024-11-08 20:26:10

手势图的设计原理(1)的相关文章

手势图的设计原理(2)拖拽、捏合、轻扫、旋转

ViewController.m #import "ViewController.h" @interface ViewController (){    UIImageView *imageView;} @end @implementation ViewController - (void)viewDidLoad {    [super viewDidLoad];    self.view.backgroundColor = [UIColor whiteColor];       im

深入浅出 Viewport 设计原理

Viewport 是 HTML5 针对移动端开发新增的一个 meta 属性, 它的作用是为同一网页在不同设备的呈现,提供响应式解决方案.这篇文章尝试通过循序渐进的方式,逐层探索 Viewport 的设计原理,希望能给读者带来更加清晰.更加全面的技术认知. 一.引言 在PC时代,我们用 css 设置 1px 边框,显示器会用1个物理像素进行渲染.而进入移动应用时代后,我们原来设置1px边框,在手机上可能需要用 2 个或 3 个物理像素来渲染. 那么,手机为什么要这么做?解决了什么问题?以及我们开发

BigPipe设计原理

高性能页面加载技术--BigPipe设计原理及Java简单实现 1.技术背景 动态web网站的历史可以追溯到万维网初期,相比于静态网站,动态网站提供了强大的可交互功能.经过几十年的发展,动态网站在互动性和页面显示效果上有了很大的提升,但是对于网站动态网站的整体页面加载架构没有做太大的改变.对于用户而言,页面的加载速度极大的影响着用户体验感.与静态网站不同,除了页面的传输加载时间外,动态网站还需考虑服务端数据的处理时间.像facebook这样大型的用户社交网站,必须考虑用户访问速度问题, 传统we

Atitit.异常的设计原理与&#160;策略处理&#160;java&#160;最佳实践&#160;p93

Atitit.异常的设计原理与 策略处理 java 最佳实践 p93 1 异常方面的使用准则,答案是::2 1.1 普通项目优先使用异常取代返回值,如果开发类库方面的项目,最好异常机制与返回值都提供,由调用者决定使用哪种方式..2 1.2 优先把异常抛出到上层处理..异常本身就是为了方便把异常情况抛出到上层处理..2 1.3 对于 HYPERLINK \l _Toc6222 方法调用结果异常情况返回策略,最终会有四种策略状况,2 1.4 返回null  还是异常??2 2 异常的由来与设计3 2

Spring?IOC设计原理解析:本文乃学习整理参考而来

Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. IoC容器的初始化 1. XmlBeanFactory(屌丝IOC)的整个流程 2. FileSystemXmlApplicationContext 的IOC容器流程 1.高富帅IOC解剖 2. 设置资源加载器和资源定位 3.AbstractApplicationContext的refresh函数载入

MyBatis的二级缓存的设计原理

MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分析MyBatis的二级缓存的设计原理. 1.MyBatis的缓存机制整体设计以及二级缓存的工作模式 如上图所示,当开一个会话时,一个 SqlSession对象会使用一个 Executor对象来完成会话操作, MyBatis的二级缓存机制的关键就是对这个 Executor对象做文章.如果用户配置了" cacheEnabled=true",那么 MyBatis在为 Sql

Android ListView下拉/上拉刷新:设计原理与实现

 <Android ListView下拉/上拉刷新:设计原理与实现> Android上ListView的第三方开源的下拉刷新框架很多,应用场景很多很普遍,几乎成为现在APP的通用设计典范,甚至谷歌官方都索性在Android SDK层面支持下拉刷新,我之前写了一篇文章<Android SwipeRefreshLayout:谷歌官方SDK包中的下拉刷新>专门介绍过(链接地址:http://blog.csdn.net/zhangphil/article/details/4696537

Verilog HDL设计进阶:有限状态机的设计原理及其代码风格_zt

http://www.21ic.com/app/eda/201308/189781_1.htm 由于Verilog HDL和 VHDL 行为描述用于综合的历史还只有短短的几年,可综合风格的Verilog HDL 和VHDL的语法只是它们各自语言的一个子集.又由于HDL的可综合性研究近年来非常活跃,可综合子集的国际标准目前尚未最后形成,因此各厂商的综合器所支持的HDL子集也略有所不同. 本书中有关可综合风格的Verilog HDL的内容,我们只着重介绍RTL级.算法级和门级逻辑结构的描述,而系统级

《深入理解mybatis原理》 MyBatis的二级缓存的设计原理

MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分析MyBatis的二级缓存的设计原理. 1.MyBatis的缓存机制整体设计以及二级缓存的工作模式 如上图所示,当开一个会话时,一个SqlSession对象会使用一个Executor对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章.如果用户配置了"cacheEnabled=true",那么MyBatis在为SqlSession