Swift微信摇一摇的实现

先附上demo地址:
demo
iOS自带了识别摇动的功能,实现起来非常简单,只需要

1
2
3
4
  /**
开启摇动感应
*/ UIApplication.sharedApplication().applicationSupportsShakeToEdit = true

becomeFirstResponder()

然后只需要实现它的三个方法

//开始摇动
    override func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent?) 
//取消摇动
    override func motionCancelled(motion: UIEventSubtype, withEvent event: UIEvent?) 
//结束摇动
    override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?)

了解了方法之后接下来就是我们的实现

第一步

首先我们用xib搭建一个界面,注意上下其实是两张图片,等会就是控制它们的frame实现摇动效果,然后我们导入摇一摇的音效

此处输入图片的描述

第二步,连线xib并导入AVFoundation框架并遵守AVAudioPlayerDelegate

1
2
3
4
5
6

import AVFoundation
@IBOutlet weak var rockup: UIImageView!
@IBOutlet weak var rockdown: UIImageView!

var player: AVAudioPlayer?

第三步,实现开始动画

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

/**
开始摇动
*/

override func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent?) {

print("开始摇动")

//开始动画
UIView.animateKeyframesWithDuration(0.5, delay: 0, options: UIViewKeyframeAnimationOptions.BeginFromCurrentState, animations: { () -> Void in

self.rockup.frame.origin.y -= 80
self.rockdown.frame.origin.y += 80

}, completion: nil)
/// 设置音效
let path1 = NSBundle.mainBundle().pathForResource("rock", ofType:"mp3")
let data1 = NSData(contentsOfFile: path1!)
self.player = try? AVAudioPlayer(data: data1!)
self.player?.delegate = self
self.player?.updateMeters()//更新数据
self.player?.prepareToPlay()//准备数据
self.player?.play()

//结束动画
UIView.animateKeyframesWithDuration(0.5, delay: 1.0, options: UIViewKeyframeAnimationOptions.BeginFromCurrentState, animations: { () -> Void in

self.rockup.frame.origin.y += 80
self.rockdown.frame.origin.y -= 80

}, completion: nil)

}
实现取消方法

/**
取消摇动
*/

override func motionCancelled(motion: UIEventSubtype, withEvent event: UIEvent?) {

print("取消摇动")
SVProgressHUD.showErrorWithStatus("还不够用力哦 请使劲的摇我吧", maskType: SVProgressHUDMaskType.Black)
}
实现结束方法,然后可以在此处实现想要摇一摇实现的功能

/**
摇动结束

*/

override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {

print("摇动结束")
///此处设置摇一摇需要实现的功能
let nav = UINavigationController(rootViewController: WDLoadNearByTableViewController())
presentViewController(nav, animated: true, completion: nil)

/// 设置音效
let path = NSBundle.mainBundle().pathForResource("rock_end", ofType:"mp3")
let data = NSData(contentsOfFile: path!)
self.player = try? AVAudioPlayer(data: data!)
self.player?.delegate = self
self.player?.updateMeters()//更新数据
self.player?.prepareToPlay()//准备数据
self.player?.play()
}
到此为止一个完整的摇一摇功能就实现了