美文网首页
iOS - 振动相关调研

iOS - 振动相关调研

作者: 温柔vs先生 | 来源:发表于2021-01-11 11:18 被阅读0次

公司最近想实现振动可控的功能,以前都是通过对api的调用,实现一个短振的的效果,后来通过查找发现苹果已经在iOS13时,已经提供了这样的API框架。在介绍这个框架之前,先介绍一个我们平时实现振动效果的几种方式:

一. AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)

  • 普通短震,3D Touch 中 Pop 震动反馈 AudioServicesPlaySystemSound(1520);

  • 普通短震,3D Touch 中 Peek 震动反馈 AudioServicesPlaySystemSound(1519);

  • 连续三次短震 AudioServicesPlaySystemSound(1521);

二. iOS10后苹果开放的 UIFeedbackGenerator

主要有下面几个类,通过枚举类型实现不同的振动反馈

  1. UINotificationFeedbackGenerator
  • 成功 UINotificationFeedbackTypeSuccess
  • 警告 UINotificationFeedbackTypeWarning
  • 错误 UINotificationFeedbackTypeError
+ (void)executeSuccessFeedback
{
 UINotificationFeedbackGenerator *generator = [[UINotificationFeedbackGenerator alloc] init];
 [generator notificationOccurred:UINotificationFeedbackTypeSuccess];
}
  1. UIImpactFeedbackGenerator

有以下5种枚举

typedef NS_ENUM(NSInteger, UIImpactFeedbackStyle) {
    UIImpactFeedbackStyleLight,
    UIImpactFeedbackStyleMedium,
    UIImpactFeedbackStyleHeavy,
    UIImpactFeedbackStyleSoft     API_AVAILABLE(ios(13.0)),
    UIImpactFeedbackStyleRigid    API_AVAILABLE(ios(13.0))
};

分别代表轻度、中度、重度、柔软、僵硬。

+ (void)excuteLightFeedback

{

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

 [generator prepare];

 [generator impactOccurred];

}
  1. UISelectionFeedbackGenerator

用来模拟选择滚轮一类控件时的震动,eg:pickerview

+ (void)excuteSelectionFeedback

{

 UISelectionFeedbackGenerator *generator = [[UISelectionFeedbackGenerator alloc] init];

 [generator selectionChanged];

}

三. iOS13后苹果开放的 Core Haptics框架

该框架包含音频和振动反馈,可以控制振动的强度,频率,时间等。

  1. CHHapticEngine
  2. CHHapticPattern
  3. CHHapticEvent

主要有以下4种枚举:

typedef NSString *CHHapticEventType NS_TYPED_ENUM;

CH_EXPORT
CHHapticEventType CHHapticEventTypeHapticTransient API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT
CHHapticEventType CHHapticEventTypeHapticContinuous API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT
CHHapticEventType CHHapticEventTypeAudioContinuous API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT
CHHapticEventType CHHapticEventTypeAudioCustom API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);

分别表示振动短暂的,可连续的,音频可连续的,通常的,

注意⚠️:可连续一定要使用包含duration这个方法

event = [[CHHapticEvent alloc] initWithEventType:CHHapticEventTypeHapticContinuous parameters:@[parameter1, parameter2] relativeTime:0 duration:1];
  1. CHHapticEventParameter
  • CHHapticEventParameterID 用于修改单个触觉和/或音频事件的参数。
typedef NSString *CHHapticEventParameterID NS_TYPED_ENUM;

CH_EXPORT CHHapticEventParameterID CHHapticEventParameterIDHapticIntensity API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticEventParameterID CHHapticEventParameterIDHapticSharpness API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);

CH_EXPORT CHHapticEventParameterID CHHapticEventParameterIDAttackTime API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticEventParameterID CHHapticEventParameterIDDecayTime API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticEventParameterID CHHapticEventParameterIDReleaseTime API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticEventParameterID CHHapticEventParameterIDSustained API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);

CH_EXPORT CHHapticEventParameterID CHHapticEventParameterIDAudioVolume API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticEventParameterID CHHapticEventParameterIDAudioPitch API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticEventParameterID CHHapticEventParameterIDAudioPan API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticEventParameterID CHHapticEventParameterIDAudioBrightness API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);

不同的ID代表不同的类型。

  • CHHapticDynamicParameterID 用于动态修改模式内所有触觉或音频事件的参数。
typedef NSString *CHHapticDynamicParameterID NS_TYPED_ENUM;

CH_EXPORT CHHapticDynamicParameterID CHHapticDynamicParameterIDHapticIntensityControl API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticDynamicParameterID CHHapticDynamicParameterIDHapticSharpnessControl API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticDynamicParameterID CHHapticDynamicParameterIDHapticAttackTimeControl API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticDynamicParameterID CHHapticDynamicParameterIDHapticDecayTimeControl API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticDynamicParameterID CHHapticDynamicParameterIDHapticReleaseTimeControl API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);

CH_EXPORT CHHapticDynamicParameterID CHHapticDynamicParameterIDAudioVolumeControl API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticDynamicParameterID CHHapticDynamicParameterIDAudioPanControl API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticDynamicParameterID CHHapticDynamicParameterIDAudioBrightnessControl API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticDynamicParameterID CHHapticDynamicParameterIDAudioPitchControl API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticDynamicParameterID CHHapticDynamicParameterIDAudioAttackTimeControl API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticDynamicParameterID CHHapticDynamicParameterIDAudioDecayTimeControl API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);
CH_EXPORT CHHapticDynamicParameterID CHHapticDynamicParameterIDAudioReleaseTimeControl API_AVAILABLE(ios(13.0), macos(10.15), tvos(14.0), macCatalyst(13.0)) API_UNAVAILABLE(watchos);

最终使用:

/// 添加振动
- (void)addFeedback {
    NSError *error = nil;
    self.engine = [[CHHapticEngine alloc] initAndReturnError:&error];

    DataModel *model = [DataModel shareInstance];
    /// 强度
    CHHapticEventParameter *parameter1 = [[CHHapticEventParameter alloc] initWithParameterID:CHHapticEventParameterIDHapticIntensity value:model.strengthIndex];
    /// 频率
    CHHapticEventParameter *parameter2 = [[CHHapticEventParameter alloc] initWithParameterID:CHHapticEventParameterIDHapticSharpness value:model.frequency];

    CHHapticEvent *event;
    if ([model.type isEqualToString:@"1"]) {
         // 任意长度
        event = [[CHHapticEvent alloc] initWithEventType:CHHapticEventTypeHapticContinuous parameters:@[parameter1, parameter2] relativeTime:0 duration:[model.time floatValue]];
    }else {
        // 短暂
        event = [[CHHapticEvent alloc] initWithEventType:CHHapticEventTypeHapticTransient parameters:@[parameter1, parameter2] relativeTime:0];
    }
    CHHapticPattern *patten = [[CHHapticPattern alloc] initWithEvents:@[event] parameterCurves:@[] error:&error];

    id player = [self.engine createPlayerWithPattern:patten error:&error];

    [self.engine startAndReturnError:&error];

    [player startAtTime:0 error:&error];
    
}

⚠️这里CHHapticEngine一定要是全局变量,如果是局部,会导致用完释放,下次点击没有声音。

参考链接:
https://www.jianshu.com/p/a5e0d91f489b
https://www.jianshu.com/p/ed644e8985ae

相关文章

网友评论

      本文标题:iOS - 振动相关调研

      本文链接:https://www.haomeiwen.com/subject/sggraktx.html