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驱动配置详解

