iOS开发系列之运动事件

news/2024/7/5 9:46:05

前面我们主要介绍了触摸事件以及由触摸事件引出的手势识别,下面我们简单介绍一下运动事件。在iOS中和运动相关的有三个事件:开始运动、结束运动、取消运动。

监听运动事件对于UI控件有个前提就是监听对象必须是第一响应者(对于UIViewController视图控制器和UIAPPlication没有此要求)。这也就意味着如果监听的是一个UI控件那么-(BOOL)canBecomeFirstResponder;方法必须返回YES。同时控件显示时(在-(void)viewWillAppear:(BOOL)animated;事件中)调用视图控制器的becomeFirstResponder方法。当视图不再显示时(在-(void)viewDidDisappear:(BOOL)animated;事件中)注销第一响应者身份。

由于视图控制器默认就可以调用运动开始、运动结束事件在此不再举例。现在不妨假设我们现在在开发一个摇一摇找人的功能,这里我们就自定义一个图片展示控件,在这个图片控件中我们可以通过摇晃随机切换界面图片。代码比较简单:

KCImageView.m

//
//  KCImageView.m
//  TouchEventAndGesture
//
//  Created by Kenshin Cui on 14-3-16.
//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#import "KCImageView.h"
#define kImageCount 3

@implementation KCImageView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.image=[self getImage];
    }
    return self;
}

#pragma mark 设置控件可以成为第一响应者
-(BOOL)canBecomeFirstResponder{
    return YES;
}

#pragma mark 运动开始
-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    //这里只处理摇晃事件
    if (motion==UIEventSubtypeMotionShake) {
        self.image=[self getImage];
    }
}
#pragma mark 运动结束
-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{

}


#pragma mark 随机取得图片
-(UIImage *)getImage{
    int index= arc4random()%kImageCount;
    NSString *imageName=[NSString stringWithFormat:@"avatar%i.png",index];
    UIImage *image=[UIImage imageNamed:imageName];
    return image;
}
@end

KCShakeViewController.m

//
//  KCShakeViewController.m
//  TouchEventAndGesture
//
//  Created by Kenshin Cui on 14-3-16.
//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#import "KCShakeViewController.h"
#import "KCImageView.h"

@interface KCShakeViewController (){
    KCImageView *_imageView;
}

@end

@implementation KCShakeViewController

- (void)viewDidLoad {
    [super viewDidLoad];


}

#pragma mark 视图显示时让控件变成第一响应者
-(void)viewDidAppear:(BOOL)animated{
    _imageView=[[KCImageView alloc]initWithFrame:[UIScreen mainScreen].applicationFrame];
    _imageView.userInteractionEnabled=true;
    [self.view addSubview:_imageView];
    [_imageView becomeFirstResponder];
}

#pragma mark 视图不显示时注销控件第一响应者的身份
-(void)viewDidDisappear:(BOOL)animated{
    [_imageView resignFirstResponder];
}

/*视图控制器的运动事件*/
//-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
//    NSLog(@"motion begin...");
//}
//
//-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
//    NSLog(@"motion end.");
//}

@end

运行效果(下图演示时使用了模拟器摇晃操作的快捷键,没有使用鼠标操作):


http://www.niftyadmin.cn/n/2525432.html

相关文章

C语言 side effect 和 sequence point

C语言 side effect 和 sequence point 2011-09-18 16:16 126人阅读 评论(0) 收藏 举报语言cobject编译器functionfileC 语言中,术语副作用(side effect)是指对数据对象或者文件的修改。例如,以下语句 var 99;的副作用是把…

L3-005. 垃圾箱分布

L3-005. 垃圾箱分布 题目链接:https://www.patest.cn/contests/gplt/L3-005 Dijstra 与L2-001.紧急救援类似,是Dijstra最短路的拓展,要注意排序是按照: 1.到所有居民点的最小距离的最大; 2.平均距离最短; 3…

java-对象的理解-对象在内存的存储

String str; 这段代码表示创建一个名叫str的String类型的reference。 这个reference保存在栈stack中,速度很快,但它并没有保存词或者句子的数据,它仅仅是目标数据的一个指向。 如果此时向str发送一个消息,就会返回一个运行时错误&…

怎么设置自定义Tabbar的文字大小 -------ios

系统默认的tabbar感觉好小,很丑,于是得自己来设置它的大小 我们需要在 (void)load 或者在 (void)initialize 里设置 那这两个方法有什么区别呢 可以看这里 :(转载)http://www.jianshu.com/p/9368ce9bb8f9 我们在这里…

删除两个双向循环链表的相同节点

删除两个双向循环链表的相同节点 分类: Data Structure 面试题集2011-09-23 12:37 1242人阅读 评论(1) 收藏 举报nulldeletestructsystemc有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一个函数…

Unity Shader - Simple Toon Shading - 简单卡通渲染

文章目录最终效果 - Final Effect无光照,只有纹理与主色调Shader加描边 - OutlineGIFShader添加光影 - RecieveShadow自身接收阴影Shader调整阴影 - Adjusting Shadow ParamsShader无透视法线挤出描边Shader整体运行效果高光 - SpecularShader边缘光 - RimShader控制…

javascript(十五) 错误处理技术

为什么80%的码农都做不了架构师?>>> 错误处理技术 常见的异常EvalError, RangeError ,ReferenceError ,SyntaxError ,TypeError ,URIError 其他就是语法规则try {}catch…

给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数

给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数 分类: c/c 数据结构算法2011-07-16 22:40 594人阅读 评论(0) 收藏 举报[cpp] view plaincopyprint? /* 给定一个存放整数的数组,重新排列数组使得数组左边为…