iOS仿微信摇一摇动画效果加震动音效实例

发布时间 - 2026-01-11 00:25:53    点击率:

众所周知, 微信中的摇一摇功能: 搜索人/歌曲/电视,同样在一些其他类APP中也有一个摇一摇签到, 摇一摇随机选号等功能,下面以微信摇一摇功能来介绍实现原理.

对于摇一摇功能, 在iOS中系统默认为我们提供了摇一摇的功能检测API. iOS 中既然已经提供了接口, 我们直接调用就好了.

#import <QuartzCore/QuartzCore.h>
#import <AudioToolbox/AudioToolbox.h>

实现原理

1. 监听摇一摇方法

// 摇一摇开始
- (void)motionBegan:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);
// 摇一摇结束
- (void)motionEnded:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);
// 摇一摇取消
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);

2. 解决摇一摇失效的情况.

ps: 使用 Xcode6.x 后创建的项目,仅仅实现第一步监听就可以实现,没有遇到这种问题.

- (BOOL)canBecomeFirstResponder {
  return YES;
}

3. 摇一摇阶段需要震动及声音.

// 摇动开始
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
  AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}
// 摇动结束
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {

  if (motion ==UIEventSubtypeMotionShake ) {

    // 1.添加摇动动画
    // 见第四点, 推荐第四点的方法二

    // 2.设置播放音效
    SystemSoundID soundID; 
    NSString *path = [[NSBundle mainBundle ] pathForResource:@"shake_sound_male" ofType:@"wav"];
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:path], &soundID);
    // 添加摇动声音
    AudioServicesPlaySystemSound (soundID);

    // 3.设置震动
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
  }
}

4. 摇一摇阶段需要动画效果.

微信的摇一摇功能是先在视图上放一个摇后要显示的图片:手拿手机的图片, 这个图片就是上下两半拼在一起给人一种一张图片的感觉;当检测到摇一摇 捕捉到晃动事件后,上下两张图片分别上下做一个动画移动(上面的一半往上移,下面的往下移),在completion 里面再移回来.

这里有两种方法:

方法一: 抽出来添加动画效果的方法, 在摇一摇结束方法里添加这个方法.

- (void)addAnimations {

  // 让imgup上下移动
  CABasicAnimation *translation2 = [CABasicAnimation animationWithKeyPath:@"position"];
  translation2.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
  translation2.fromValue = [NSValue valueWithCGPoint:CGPointMake(160, 115)];
  translation2.toValue = [NSValue valueWithCGPoint:CGPointMake(160, 40)];
  translation2.duration = 0.5;
  translation2.repeatCount = 1;
  translation2.autoreverses = YES;

  // 让imagdown上下移动
  CABasicAnimation *translation = [CABasicAnimation animationWithKeyPath:@"position"];
  translation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
  translation.fromValue = [NSValue valueWithCGPoint:CGPointMake(160, 345)];
  translation.toValue = [NSValue valueWithCGPoint:CGPointMake(160, 420)];
  translation.duration = 0.5;
  translation.repeatCount = 1;
  translation.autoreverses = YES;

  [self.imgDown.layer addAnimation:translation forKey:@"translation"];
  [self.imgUp.layer addAnimation:translation2 forKey:@"translation2"];
}

方法二. 在摇一摇开始和结束里添加摇动动画效果及菊花效果

/**
 * 摇动开始
 */
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {

  NSLog(@"开始摇了");

  // 菊花显示并开始转动
  self.aiLoad.hidden = NO;
  [self.aiLoad startAnimating];

  AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

  CGFloat offset = self.bgImgView.height * 0.5;
  CGFloat duration = 0.4;
  [UIView animateWithDuration:duration animations:^{
    self.imgUp.y -= offset;
    self.imgDown.y += offset;
  }];
}

/**
 * 摇动结束
 */
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {

  NSLog(@"摇动结束");

  // 不是摇一摇事件则返回
  if (motion != UIEventSubtypeMotionShake) return;

  // 1.添加摇动动画
  CGFloat offset = self.bgImgView.height * 0.5;
  CGFloat duration = 0.4;
  [UIView animateWithDuration:duration animations:^{
    self.imgUp.y += offset;
    self.imgDown.y -= offset;
  }];

  // 菊花暂停转动并隐藏
  [self.aiLoad stopAnimating];
  self.aiLoad.hidden = YES;
}

当然也有使用摇一摇做其他功能的,可以在当结束摇动时,就发送一个网络请求作相关操作即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# ios  # 微信摇一摇  # 微信摇一摇demo  # 摇一摇动画  # iOS中关于Taptic-Engine震动反馈的深入解析  # IOS开发实现手机震动的提示实例代码  # 基于iOS实现音乐震动条效果  # iOS中震动反馈(UIFeedbackGenerator)与系统震动详解  # 也有  # 给人  # 做一个  # 摇了  # 中也  # 两张  # 等功能  # 有两种  # 往下  # 往上  # 先在  # 众所周知  # 信中  # 大家多多  # 手拿  # 就可以  # 有一个  # 检测到  # 捉到  # 默认为 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  佛山企业网站制作公司有哪些,沟通100网上服务官网?  如何在IIS中新建站点并解决端口绑定冲突?  Laravel如何使用模型观察者?(Observer代码示例)  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  Laravel如何处理表单验证?(Requests代码示例)  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  佛山网站制作系统,佛山企业变更地址网上办理步骤?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  如何在Tomcat中配置并部署网站项目?  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Android仿QQ列表左滑删除操作  Laravel如何保护应用免受CSRF攻击?(原理和示例)  Linux系统运维自动化项目教程_Ansible批量管理实战  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Python文件流缓冲机制_IO性能解析【教程】  php结合redis实现高并发下的抢购、秒杀功能的实例  如何在阿里云服务器自主搭建网站?  Laravel如何处理异常和错误?(Handler示例)  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  java ZXing生成二维码及条码实例分享  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  详解Android——蓝牙技术 带你实现终端间数据传输  如何快速搭建二级域名独立网站?  Laravel怎么在Controller之外的地方验证数据  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Swift中swift中的switch 语句  独立制作一个网站多少钱,建立网站需要花多少钱?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  怎么用AI帮你为初创公司进行市场定位分析?  如何用PHP快速搭建高效网站?分步指南  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  如何在IIS服务器上快速部署高效网站?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  如何确认建站备案号应放置的具体位置?  如何在万网ECS上快速搭建专属网站?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  长沙做网站要多少钱,长沙国安网络怎么样?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  如何快速完成中国万网建站详细流程?  Laravel Session怎么存储_Laravel Session驱动配置详解