注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

实现手势识别(二)  

2013-05-09 21:15:42|  分类: ios开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

检测旋转手势

当用户通过手指在屏幕中对某个元素进行旋转时,你希望能够检测到这个旋转手势。

创建一个 UIRotationGestureRecognizer 对象,然后将其添加到目标 view

UIRotationGestureRecognizer 手势识别器,就像名称一样,这个类能用来监听和捕获旋 转的手势,能帮助你创建出更直观的图形用户界面,比如一种场景,当你的应用中有一个展 示图片的视图,用户需要通过旋转图片来调整图片的方向。

UIRotationGestureRecognizer 这个类有一个 rotation 的属性,这个属性可以用来设置旋转 的方向和旋转的弧度。旋转是从手指的初始位置(UIGestureRecognizerStateBegan)到最终 位置(UIGestureRecognizerStateBegan)决定的。

为了对继承自 UIView UI 元素进行旋转,你可以将旋转手势识别器的 rotation 属性传 递给 CGAffineTransformMakeRotation 方法,以制作一个仿射转场。 

代码如下:

#import <UIKit/UIKit.h>


@interface ViewController : UIViewController


@property (nonatomic,strong) UIRotationGestureRecognizer *rotationGestureRecognizer;

@property (nonatomic,strong) UILabel *helloWorldLabel;

@property (nonatomic,unsafe_unretained) CGFloat rotationAngleInRadians;


@end


--------------------

#import "ViewController.h"


@interface ViewController ()


@end


@implementation ViewController


- (void) handleRotations: (UIRotationGestureRecognizer *) paramSender

{

    if (self.helloWorldLabel == nil)

    {

        return ;

    }

    

    self.helloWorldLabel.transform = CGAffineTransformMakeRotation(self.rotationAngleInRadians + paramSender.rotation);

    

    if (paramSender.state == UIGestureRecognizerStateEnded)

    {

        self.rotationAngleInRadians += paramSender.rotation;

    }

}


- (void)viewDidLoad

{

    [super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

    self.view.backgroundColor = [UIColor whiteColor];

    self.helloWorldLabel = [[UILabel alloc] initWithFrame:CGRectZero];

    self.helloWorldLabel.text = @"Hello World!";

    self.helloWorldLabel.font = [UIFont systemFontOfSize:16.0f];

    [self.helloWorldLabel sizeToFit];

    self.helloWorldLabel.center = self.view.center;

    [self.view addSubview:self.helloWorldLabel];

    self.rotationGestureRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self

                                                                                  action:@selector(handleRotations:)];

    [self.view addGestureRecognizer:self.rotationGestureRecognizer];

}




- (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end


首先让我们来看一看这段代码中的几个属性,以及解释一下他们的作用

helloWorldLabel

这是一个 lable,我们需要将其添加到 view controller view .然后我们将通过编写代 码——当用户做旋转手势时,对这个 lable 进行旋转。

rotationGestureRecognizer

  这个不用多说,是我们的旋转手势的监听捕获实例对象,随后我会对其进行分配和初始
化。

rotationAngleInRadians
这个值表示了 lable 旋转的具体角度。刚开始的时候我们将其初始化为 0

其实你也不用考虑太多,虽然标签的位置并不重要,我们还是让标签在他的周围进行一 个旋转的,无论我们的视图和标签在什么地方,唯一值得我们注意的就是,在不同的设备, 由于屏幕尺寸(ipad,iphone)不一样,所以我们都是需要来自动进行计算,计算下一次旋 转的值达到旋转的效果。

通过使用标签的 center 这个属性,然后设置一个中心位置值给我们的窗体界面,我们将 会把我们的标签居中显示,然后我们在旋转这个标签的时候也是依据这个中心位置进行一个 旋转。


这个旋转手势识别器将会给我们传递一组旋转的角度,旋转手势识别器一直还在进行一
个监听的动作,因此他会一边监听我们手势旋转的角度,一边把这些捕获到的角度传递给我 

们,然后我们可以利用这些角度信息,进行一些位置的计算,然后调整下一个显示的位置。


注意,如果你使用的是模拟器,并不是真机,你仍然可以来测试这个旋转 

的手势,你需要使用 Option 这个键,然后你会看到在模拟器中间有两个圆环,你可以通过 调整圆环的位置,来进行手势的旋转,在旋转的时候,你还必须使用到 Alt 键和 Shift 键, 这样你才能够正常的旋转。 

在添加完如上代码之后,我们可以根据旋转的手势角度给我们的这个标签设置一个旋转
的角度,但是你可能会遇到如下问题,当一个旋转的动作结束了,另外的一个旋转动作又开
始了,第二个旋转的手势角度将会把我们第一次的旋转手势角度给替换掉,因此在第一个旋
转动作没有发生的时候,第二个旋转的角度就把第一个旋转的角度覆盖掉。所以我们需要无
论这个旋转的手势动作什么时候结束,我们都必须要让当前的这次旋转动作进行下去,因此
我们就需要添加一个旋转角度的队列,让我们的标签按照这个队列中的旋转角度依次的进行
旋转运动。
  评论这张
 
阅读(64)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017