《iOS 6高级开发手册(第4版)》——1.12节使用运动事件检测晃动

简介:

本节书摘来自异步社区《iOS 6高级开发手册(第4版)》一书中的第1章,第1.12节使用运动事件检测晃动,作者 【美】Erica Sadun,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.12 使用运动事件检测晃动
iOS 6高级开发手册(第4版)
当iPhone检测到一个运动事件时,它会把该事件传递给当前的第一个响应者,即响应者链中的主对象。响应者是可以处理事件的对象,所有的视图和窗口都是响应者,因此也是应用程序对象。

响应者链提供了一种对象层次结构,所有的对象都可以响应事件。当朝向链开始处的对象接收到一个事件时,不会进一步传递那个事件。对象会处理它。如果它不能处理,可以把该事件转移给下一个响应者。

对象通常可以通过把它们自己声明为第一个响应者来获得这种身份,这是通过become FirstResponder实现的。在这个代码段中,UIViewController确保它会变成第一个响应者,只要它的视图出现在屏幕上即可。一旦消失,它将放弃第一个响应者的身份:

- (BOOL)canBecomeFirstResponder {
    return YES;
}

// Become first responder whenever the view appears
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
}

// Resign first responder whenever the view disappears
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self resignFirstResponder];
}

第一个响应者将接收所有的触摸和运动事件。运动回调反映了UIView触摸回调阶段。回调方法如下。

motionBegan:withEvent::这个回调指示运动事件的开始。在编写本书时,只能识别一类运动事件:晃动。将来可能不是这样,因此你可能想在代码中检查运动类型。
motionEnded:withEvent::在第一个响应者在运动事件结束时接收这个回调。
motionCancelled:withEvent::与触摸一样,可以通过打入的电话和其他系统事件取消运动。Apple建议在代码中实现全部3个运动事件回调(类似地,还要实现全部4个触摸事件回调)。
下面的代码段显示了一对运动回调的示例。如果在设备上测试它们,可以注意到几件事。第一,从用户的角度看,开始和结束事件几乎是同时发生的,为这两类事件播放声音有些小题大做。第二,它偏向于进行从一侧到另一侧的晃动检测,与前后和上下晃动相比,iPhone更擅长检测从一侧到另一侧的晃动。最后,Apple的运动实现使用了一种轻微锁定的方法。直到生成了另一个运动事件或者在处理了前一个运动事件之后,才能生成一个新的运动事件。Shake to Shuffle和Shake to Undo事件使用了相同的锁定机制:

- (void)motionBegan:(UIEventSubtype)motion
    withEvent:(UIEvent *)event {

    // Play a sound whenever a shake motion starts
    if (motion != UIEventSubtypeMotionShake) return;
    [self playSound:startSound];
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    // Play a sound whenever a shake motion ends
    if (motion != UIEventSubtypeMotionShake) return;
    [self playSound:endSound];
}
相关文章
|
测试技术 程序员 C++
iOS:项目中无用类检测和无用图片检测汇总
在涉及到项目大改版,或者涉及到某个功能模块大变更,就会涉及到图片废弃和文件废弃的情况。 但是这时候就会遗留下一个很大的问题,没有将废弃的、无用的文件类或资源删除干净。而这次需要对工程代码的无用资源和无用文件进行删除处理,感触颇多,故在此笔记。 首先,感觉很多人的代码习惯还是恶待提高。比如我发现一些人的代码操作习惯,从好到次,可以大略分以下情况
1296 0
iOS:项目中无用类检测和无用图片检测汇总
|
7月前
|
设计模式 定位技术 开发工具
探索iOS开发:从初级到高级的旅程
本文将深入探讨iOS开发的各个方面,从基础知识到高级技术,以及如何从初级开发者成长为高级开发者。我们将讨论各种工具、技术和策略,以帮助你在iOS开发领域取得成功。无论你是刚刚开始学习iOS开发,还是已经有一些经验并希望提升你的技能,这篇文章都将为你提供有价值的信息和建议。
|
7月前
|
监控 API iOS开发
克魔助手 - iOS性能检测平台
众所周知,如今的用户变得越来越关心app的体验,开发者必须关注应用性能所带来的用户流失问题。目前危害较大的性能问题主要有:闪退、卡顿、发热、耗电快、网络劫持等,但是做过iOS开发的人都知道,在开发过程中我们没有一个很直观的工具可以实时的知道开发者写出来的代码会不会造成性能问题,虽然Xcode里提供了耗电量检测、内存泄漏检测等工具,但是这些工具使用效果并不理想(如Leak无法发现循环引用造成的内存泄漏)。所以这篇文章主要是介绍一款实时监控app各项性能指标的工具,包括CPU占用率、内存使用量、内存泄漏、FPS、卡顿检测,并且会分析造成这些性能问题的原因。
|
存储 iOS开发
iOS主线程耗时检测方案
找出那个拖后腿的凶手
237 1
iOS主线程耗时检测方案
|
iOS开发
iOS UIDevice & 屏幕旋转检测
iOS UIDevice & 屏幕旋转检测
53 0
|
存储 iOS开发 UED
iOS 性能检测新方式​——AnimationHitches
iOS 性能检测新方式​——AnimationHitches
iOS 性能检测新方式​——AnimationHitches
|
iOS开发
iOS 检测字符串中数字个数、特殊符号个数
iOS 检测字符串中数字个数、特殊符号个数
173 0
|
iOS开发
iOS 检测字符串中是否含有数字、特殊符号
iOS 检测字符串中是否含有数字、特殊符号
385 0
|
iOS开发
iOS 检测字符串中是否含有字母、大写字母、小写字母
iOS 检测字符串中是否含有字母、大写字母、小写字母
333 0
|
iOS开发
iOS开发 - touchBegan事件判断点击的位置在View上还是在View的子View上
iOS开发 - touchBegan事件判断点击的位置在View上还是在View的子View上
279 0
iOS开发 - touchBegan事件判断点击的位置在View上还是在View的子View上