iOS中的震动反馈

作者: 爱笑的猫mi | 来源:发表于2020-06-02 09:23 被阅读0次

一、震动反馈的来源
为了增强交互性,我们经常会在用户触发某个动作时候,给用户一定的硬件反馈。比如切换tabbar,下拉刷新列表,点击某个btn。

二、<1>实现原理
较早的系统版本,我们会使用AudioTool.framework。
主要在这个AudioTool.framework里

#import <AudioToolbox/AudioToolbox.h>

一般震动

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

普通短震(类似3D Touch的 Peek 反馈 )

AudioServicesPlaySystemSound(1519);

普通短震 (类似3D Touch Pop 反馈)

AudioServicesPlaySystemSound(1520);

连续三次短震

AudioServicesPlaySystemSound(1521);

<2>iOS 10之后提供了一套Objective-C的接口 UIImpactFeedbackGenerator
这个枚举定义震动等级

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

@interface UIImpactFeedbackGenerator : UIFeedbackGenerator

  • (instancetype)initWithStyle:(UIImpactFeedbackStyle)style;

// 调用后立刻开始震动

  • (void)impactOccurred;

// 调用后立刻开始震动,伴随着强度等级 0 到 1

  • (void)impactOccurredWithIntensity:(CGFloat)intensity API_AVAILABLE(ios(13.0));

使用方式

UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleHeavy];
[generator impactOccurred];

三、<实战操作>

MJRefresh增加震动反馈

发现有的app在下拉刷新的时候有一下震动反馈,感觉用户体验很棒,所以想在现有的项目中也增加一个这样的效果。但是项目中使用的MJRefresh 并没有提供这样的接口,自己重新实现下拉刷新也不现实。

既然如此就需要手动去监听下拉的状态改变。
MJRefresh中刷新控件的基类MJRefreshComponent有一个state属性,是一个枚举:

/** 刷新控件的状态 */
typedef NS_ENUM(NSInteger, MJRefreshState) {
    /** 普通闲置状态 */
    MJRefreshStateIdle = 1,
    /** 松开就可以进行刷新的状态 */
    MJRefreshStatePulling,
    /** 正在刷新中的状态 */
    MJRefreshStateRefreshing,
    /** 即将刷新的状态 */
    MJRefreshStateWillRefresh,
    /** 所有数据加载完毕,没有更多的数据了 */
    MJRefreshStateNoMoreData
};

这个就属性就是刷新控件的状态值,可以使用KVO的方式在列表中监听控件状态的变化,从而增加震动反馈。

// 增加KVO监听
[_tableView.mj_header addObserver:self forKeyPath:@"state" options:NSKeyValueObservingOptionNew context:nil];

[_tableView.mj_footer addObserver:self forKeyPath:@"state" options:NSKeyValueObservingOptionNew context:nil];

实现监听方法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
    
    if ([object isEqual:self.tableView.mj_header] && self.tableView.mj_header.state == MJRefreshStatePulling) {
        [self feedbackGenerator];
    }
    else if ([object isEqual:self.tableView.mj_footer] && self.tableView.mj_footer.state == MJRefreshStatePulling) {
        [self feedbackGenerator];
    }
}

震动反馈

- (void)feedbackGenerator {
    UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleMedium];
    [generator prepare];
    [generator impactOccurred];
}

相关文章

  • iOS中的震动反馈

    一、震动反馈的来源为了增强交互性,我们经常会在用户触发某个动作时候,给用户一定的硬件反馈。比如切换tabbar,下...

  • iOS 震动反馈(UIFeedbackGenerator)和系统

    震动反馈(UIFeedbackGenerator) 震动反馈是iOS 10之后出的新特性,相比于之前的系统震动Au...

  • iOS 震动反馈

    http://zhoulingyu.com/2017/01/16/iOS——关于-Taptic-Engine-震动反馈/

  • iOS震动反馈

    长震动 支持iPhone基本机型,支持iOS9注:用户在“系统设置”中关闭了振动功能,此震动会失效。 短震动一 支...

  • iOS震动反馈

    之前的手机系统要用到的震动接口是AudioServicesPlaySystemSound,但这个震动幅度比较大,如...

  • ios的震动反馈

    最近写 ios TableView 加入长按的手势后,希望在 cell 长按弹窗的同时加入震动反馈效果。 查询后发...

  • iOS中震动反馈Haptic Feedback使用

    前几天元旦的时候,用iMessage发“新年快乐”的时候,苹果给出了放烟花的彩蛋。 这个倒是还不是很令人吃惊,真正...

  • iOS中震动反馈(UIFeedbackGenerator)与系统

    Taptic Engine 先了解一个概念——Taptic Engine Taptic Engine 是苹果产品上...

  • 对iOS震动反馈的研究

    最近真的是好久没有写简书了, 期间有无数次冲动想认真写一篇, 可是总挤不出整块的时间来写. 还有一个原因就是总觉得...

  • 系统震动or震动反馈

    一.系统震动 1.AudioServicesPlaySystemSound() 系统震动是在iOS10.0之前存在...

网友评论

    本文标题:iOS中的震动反馈

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