如何为我们的app各种事件增加震动反馈

2019-05-17  本文已影响0人  跃文

第一种方法

1. 利用<AudioToolbox>框架完成

AudioToolbox.framework是一套基于C语言的框架,使用它来播放音效其本质是将短音频注册到系统声音服务(System Sound Service)。System Sound Service是一种简单、底层的声音播放服务,但是它本身也存在着一些限制:

  • 播放短的声音文件(支持振动)
  • 你可以用它来播放一个短的声音(30秒以下)
  • 这个接口不支持等级,位置,循环,时间的控制,同时播放功能。在同一时间,你只能播放一个声音。
    -----------注意:数据必须是PCM或者IMA4格式
    -----------注意:音频文件必须打包成.caf、.aif、.wav中的一种(注意这是官方文档的说法,实际测试发现一些.mp3也可以播放)

具有震动效果的函数有两个:
void AudioServicesPlayAlertSound ( SystemSoundID inSystemSoundID );
void AudioServicesPlaySystemSound ( SystemSoundID inSystemSoundID );
注:方法在iOS2.0后开始可以使用,在这个框架中还有许多其他的回馈方法可以自行尝试。

// `Peek` 震动反馈 (weak boom)
    AudioServicesPlaySystemSound(1519);

// `Pop` 震动反馈 (strong boom)
    AudioServicesPlaySystemSound(1520);
// 
    AudioServicesPlaySystemSound(1521);

CF_ENUM(OSStatus)
{
    kAudioServicesNoError                                   =  0,
    kAudioServicesUnsupportedPropertyError                  = 'pty?',
    kAudioServicesBadPropertySizeError                      = '!siz',
    kAudioServicesBadSpecifierSizeError                     = '!spc',

    kAudioServicesSystemSoundUnspecifiedError               = -1500,
    kAudioServicesSystemSoundClientTimedOutError            = -1501,
    kAudioServicesSystemSoundExceededMaximumDurationError   = -1502
};
// 可以尝试其他数值我试过例如1000、1005会有长震动效果

具体使用示例:

- (void)playSoundAndShake {
//1.获得音效文件的全路径
    NSURL *url=[[NSBundle mainBundle] URLForResource:@"*****.wav" withExtension:nil];
//2.加载音效文件,创建音效ID(SoundID,一个ID对应一个音效文件)
  SystemSoundID soundID = 12345;
  AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &soundID);
// 完成播放之后执行的soundCompleteCallback函数
    AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, soundCompleteCallback, NULL);
//3.播放音效文件
//下面的两个函数都可以用来播放音效文件,第一个函数伴随有震动效果
    AudioServicesPlayAlertSound(soundID);
    //AudioServicesPlaySystemSound(<#SystemSoundID inSystemSoundID#>)
}
#pragma mark - 播放完成之后执行的函数
void soundCompleteCallback()
{
    NSLog(@"播放完成");
}

- (void)deallocSound:(SystemSoundID) soundID {
//把需要销毁的音效文件的 soundID 传递给它既可销毁
    //AudioServicesDisposeSystemSoundID(soundID);
}
2. 利用<UIKit>框架的“UIImpactFeedbackGenerator”类完成

在查看系统 API 时你会发现类名前标注着UIKIT_CLASS_AVAILABLE_IOS_ONLY(10_0)这个类是在iOS10之后才可用
使用示例:

    UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle: UIImpactFeedbackStyleLight];
    [generator prepare];
    [generator impactOccurred];

其中涉及枚举很容易理解

typedef NS_ENUM(NSInteger, UIImpactFeedbackStyle) {
    UIImpactFeedbackStyleLight,
    UIImpactFeedbackStyleMedium,
    UIImpactFeedbackStyleHeavy
};

sssssssss

上一篇 下一篇

猜你喜欢

热点阅读