iOS-仿膜拜贴纸滚动(物理仿真)
导读
简单用OC写了一个小球滚动效果;
类似平衡球.
- GitHub地址:https://github.com/wangliujiayou/WLBallView 欢迎Star.
进入正题-(传感器)
传感器是一种感应\检测装置, 目前已经广泛应用于智能手机上,用于感应\检测设备周边的信息,不同类型的传感器, 检测的信息也不一样
iOS中的传感器

一、CoreMotion框架介绍
iOS中的一个核心运动框架CoreMotion.framework,CoreMotion是一个专门处理Motion的框架,其中包含了两个部分加速度计和陀螺仪,在iOS4之前加速度计是由UIAccelerometer类来负责采集数据,加速计由三个坐标轴决定,用户最常见的操作设备的动作移动,晃动手机(摇一摇),倾斜手机都可以被设备检测到,加速计可以检测到线性的变化,陀螺仪可以更好的检测到偏转的动作,可以根据用户的动作做出相应的动作,iOS模拟器无法模拟以上动作,真机调试需要开发者账号。
二、CoreMotion数据获取
CoreMotion中获取数据主要是两种方式:
Push方式:
提供一个线程管理器NSOperationQueue
和一个回调Block
,CoreMotion
自动在每一个采样数据到来的时候回调这个Block
,进行处理。在这种情况下,Block
中的操作会在你自己的主线程内执行。Pull方式,在这个方式里,你必须主动去像
CMMotionManager
要数据,这个数据就是最近一次的采样数据。
1. Pull方法
- (void)pull{//初始化全局管理对象CMMotionManager *manager = [[CMMotionManager alloc] init];self.motionManager = manager;//判断加速度计可不可用,判断加速度计是否开启if ([manager isAccelerometerAvailable] && [manager isAccelerometerActive]){//告诉manager,更新频率是100Hzmanager.accelerometerUpdateInterval = 1 / 60;//开始更新,后台线程开始运行。这是Pull方式。[manager startAccelerometerUpdates];}//获取并处理加速度计数据CMAccelerometerData *newestAccel = self.motionManager.accelerometerData;NSLog(@"X = %.04f",newestAccel.acceleration.x);NSLog(@"Y = %.04f",newestAccel.acceleration.y);NSLog(@"Z = %.04f",newestAccel.acceleration.z);
}
2.Push方法
//判断加速计是否可用
if([_motionManager isAccelerometerAvailable]) {// 设置加速计频率[_motionManager setAccelerometerUpdateInterval:1 / 60];//开始时时采样数据[_motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {NSLog(@"%f---%f",accelerometerData.acceleration.x,accelerometerData.acceleration.y);}];
} else{NSLog(@"设备不支持加速计");
}
陀螺仪和加速计是一样的这里就不阐述了.
iOS UIDynamicAnimator
物理的几种行为
UIAttachmentBehavior 吸附行为
UICollisionBehavior 碰撞行为
UIGravityBehavior 重力行为
UIPushBehavior 推力行为
UISnapBehavior 捕捉行为
UIAttachmentBehavior 吸附
// 1 可以跟锚点 2 可以item 与 itemself.attach = [[UIAttachmentBehavior alloc] initWithItem:self.view1 attachedToItem:self.view2];self.attach.length = 100;// 距离self.attach.damping = 0.3;// 阻尼系数(阻碍变化)self.attach.frequency = 0.5;// 振动频率,(变化速度)// self.attach.anchorPoint = CGPointMake(100, 100);[self.animator addBehavior:self.attach];
// 2者在其他动画作用下保持相互作用力.
UICollisionBehavior 碰撞
# pragma mark - 碰撞
- (UICollisionBehavior *)collision {if (_collision == nil) {_collision = [[UICollisionBehavior alloc] init];//参考边界_collision.translatesReferenceBoundsIntoBoundary = YES;//所有事物碰撞_collision.collisionMode = UICollisionBehaviorModeEverything;[self.animator addBehavior:_collision];}return _collision;}
// 1 bezierPath 边界UIBezierPath *bezierPath1 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(CGRectGetWidth(self.view.bounds)/2, CGRectGetHeight(self.view.bounds)) radius:CGRectGetWidth(self.view.bounds)/2 startAngle:0 endAngle:2*M_PI clockwise:YES];[self.collision addBoundaryWithIdentifier:@"bezierPath1" forPath:bezierPath1];// 2 point1 - point2 边界[self.collision addBoundaryWithIdentifier:@"point1_point2" fromPoint:CGPointMake(0, 300) toPoint:CGPointMake(CGRectGetWidth(self.view.bounds), 400)];
UIGravityBehavior 重力
# pragma mark - 重力
- (UIGravityBehavior *)gravity {if (_gravity == nil) {_gravity = [[UIGravityBehavior alloc] init];
// _gravity.magnitude = 1.0;[self.animator addBehavior:_gravity];}return _gravity;}
UIPushBehavior 推力
self.push = [[UIPushBehavior alloc] init];self.push.active = YES;// 是否激活self.push.angle = M_PI/4;// 方向self.push.magnitude = 0.5;// 力// self.push.pushDirection = CGVectorMake(1, 2);// 矢量
UISnapBehavior 捕捉
UISnapBehavior * snapbehavior = [[UISnapBehavior alloc] initWithItem:self.imageview snapToPoint:self.view.center];
snapbehavior.damping = 0.65;
[self.animator addBehavior:snapbehavior];
UIDynamicItemBehavior 动力学属性
# pragma mark - 动力学属性
- (UIDynamicItemBehavior *)dynamic {if (_dynamic == nil) {_dynamic = [[UIDynamicItemBehavior alloc] init];_dynamic.friction = 0.2;_dynamic.elasticity = 0.8;_dynamic.density = 0.2;_dynamic.allowsRotation = YES;_dynamic.resistance = 0;[self.animator addBehavior:_dynamic];}return _dynamic;}
具体应用
给视图添加各种行为[self.dynamic addItem:ballView];
[self.collision addItem:ballView];
[self.gravity addItem:ballView];
使物体发生物理效果if (!self.manager.isDeviceMotionAvailable) {NSLog(@"换手机吧");return;}self.manager.deviceMotionUpdateInterval = 0.01;__weak typeof(self) weakSelf = self;[self.manager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion * _Nullable motion, NSError * _Nullable error) {if (error != nil) {NSLog(@"出错了 %@",error);return;}weakSelf.gravity.gravityDirection = CGVectorMake(motion.gravity.x * 3, -motion.gravity.y * 3);// self.bkView.transform = CGAffineTransformMakeRotation(atan2(motion.gravity.x, motion.gravity.y) - M_PI);}];
框架使用
1.导入#import "WLBallView.h"
2.创建WLBallView控件
3.调用starMotion
方法即可实现
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {// 传进图片名字WLBallView * ballView = [[WLBallView alloc] initWithFrame:CGRectMake(0, 80, 50, 50) AndImageName:self.array[arc4random_uniform(4)]];[self.view addSubview:ballView];// 开始运动[ballView starMotion];}

- 源码可以从这里下载
相关文章:

Redhat、centos安装配置postgresql
一.安装postgresql 本文仅以 redhat,postgresql9.4为例,使用yum方式进行介绍。 官网:http://www.postgresql.org/download/linux/redhat/ 1.下载postgresql的yum源 yum install http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-red…

Spring Cloud应用开发(七:使用Git存储方式实现分布式配置管理 )
1、使用Git存储实现管理; 1.1、配置Git。在Git上创建microservice-study-config目录,并在目录中添加开发,预发布和测试的配置文件; 1.2、修改服务端配置文件。将microservice-config-server工程的配置文件中本地文件存储方式的配…

IOS 自定义相机, 使用 AVFoundation(附实现部分腾讯水印相机功能 demo)
原文链接:http://www.jianshu.com/p/c64bf543f16a这是一款使用 AVFoundation 自定义的相机,与系统原生相机有一样的外观但比系统的相机更好、更符合实际的开发需要、可以自己修改 UI、实现拍照、取消、闪光灯控制、前后摄像头控制、聚焦、放大缩小、拍照…

如何成为一个好的测试工程师(转载,大意)
对于测试功能是的两个不同观点:软实力和技术能力。 个人觉得技术能力80%可以被大众掌握,但是软实力是需要花费很多时间去培养和塑造的。一下几点也是能够衡量个人技能的一些标准: 1,沟通技能-口头和书面能力 与人的第一印象&#…

ubuntu下7z文件的解压方法
apt-get install p7zip-full 控制台会打出以下信息: 正在读取软件包列表... 完成正在分析软件包的依赖关系树 正在读取状态信息... 完成 建议安装的软件包: p7zip-rar下列【新】软件包将被安装: p7zip-full升级了 0 个软件包&…

Docker的使用(一:Docker入门程序)
1、编写Dockerfile文件; 注:创建一个空的Docker工作目录dockerspace,进而进入该目录,并创建编写dockerfile文件; 2、编写外部文件。 注:在当前目录(dockerspace)下分别创建require…
iOS OpenCV 图像灰度处理
2017-06-21 小溪彼岸 Cocoa开发者社区推荐人:wo709128079 有时候开发过程中,切图满足不了我们的需求,此时我们需要对图像进行灰度处理,例如QQ头像在线、离线等不同状态等。 可以尝试的解决方案: 第一种:让U…

【VS开发】【电子电路技术】RJ45以太网传输线研究
RJ45以太网传输线研究 最近研究远距离差分视频传输方案,理所当然想到了LVDS协议。至于选用cameralink传输线,还是选用其他方案,本人更倾向于廉价的RJ45以太网线来实现LVDS差分信号的传输。 由于RJ45网线内部为4对双绞线,至于以太网…

Wiz开发 定时器的使用与处理
这只是一些代码片段,由于Wiz开发的资料实在不多,而且内容都不够新。这里的代码主要参考Tools.Timer这个插件,但是由于内部实现的很多变化,Tools.Timer这个插件基本上已经无法使用了。定时器的注册与删除 使用定时器,是…

Docker的使用(二:Docker客户端常用指令练习)
1、列出镜像; 2、搜索镜像; 3、拉取镜像; 4、构建镜像; 4.1、在Dockerfile文件所在目录构建镜像; 4.2、在其他目录构建镜像; 4.3、查看镜像是否构建成功; 5、删除镜像; 6、创建并启…
实现简书个人中心UI效果
这两天比较闲,简单实现了一下个人中心页面scrollView嵌套的效果,也就是下边这个页面,大家感受一下先: JSDemo2.gif 首先讲下实现思路,很多人看到这个界面觉得是多个scrollView嵌套实现的,其实苹果不推荐scrollView的嵌…

PHPCMSv9首页显示分页点击下一页跳转链接出现错误,跳转到后台的解决方案
1 引用页写为 {pc:content action"lists" catid"10" order"updatetime DESC" thumb"0" num"1" page"$_GET[page]"}{loop $data $v}....{/loop}{$pages} {/pc}2 phpcms/libs/functions/global.func.php文件 get_…

顺序查找和二分查找
{线性的顺序查找}function seqSearch(sArr: array of Integer;aCount: Integer;const index: Integer):Integer;var i: Integer;begin Result : -1; for i : 0 to aCount do if sArr[i]index then begin Result : i; Break; end;end;{对数性的二分查找}f…

Docker的使用(三:Docker Hub远程镜像管理)
1、登录 Docker Hub; 2、修改镜像名称; 3、登录认证; 4、推送镜像; 5、查看验证;

啊里大鱼短信发送API
https://api.alidayu.com/doc2/apiDetail?spm0.0.0.0.SEe3dm&apiId25450 转载于:https://www.cnblogs.com/shiningrise/p/5626708.html

GCD API
(可直接复制到Xcode中查看) /***********************************************************************************************************************************##目录##知识点:GCD中有2个核心概念:任务和队列任务&#…

查看Linux系统中某目录的大小
命令:du -sh 目录名来查看,如下 du -sh /root 命令显示结果为:1.2M /root 检查是否有分区使用率use%过高,如发现某个分区空间接近用完,可以进入该分区的挂载点,用以下命令找出占用空间最多的文件…

Docker的使用(四:Docker Registry本地私有仓库搭建知识点总结)
任务一: Docker Registry本地私有仓库搭建 1、启动Docker Registry; 2、重命名镜像; 3、推送镜像; 4、浏览器查看验证; 5、文件查看验证; 任务二:Docker Registry本地私有仓库配置;…
iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)
2017-07-08 remember17 Cocoa开发者社区目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述。 多线程的基本概念 线程的状态与生命周期 多线程的四种解决方案:pthread,NSThreadÿ…
C基础知识小总结(十)
"如有不正确之处,请指出,谢谢" --Mood <指针和函数> 指针函数 函数指针 <最基本的使用函数指针> < 函数指针做为形参 > <字符指针> <字符数组> < 返回局部变量指针 > < 结构体指针> 指向结构体变…

支付方式(2)——支付宝集成及使用
每一个支付平台都有自己的加密、解密的原理;还有各种签名的原理;通过各种内容发送数据,防止恶意攻击等功能的原理。 接下来对于部署支付方式,首先要分清几个名词: 集成接入:支付宝已经集成好各种原理和函数…

Kali Linux攻防系统(一:攻防系统Kali Linux下载安装与更新)
任务一:攻防系统Kali Linux下载安装与更新 1.1、安装Kali Linux虚拟机 1.1.1、电脑硬件配置至少达到 CPU 内存 存储 >四核 >4G >20G 1.1.2、VMware Workstations版本为14及以上; 1.1.3、虚拟机系统版本选择Debian 8.X或者Ubuntu&#x…

iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(下)
2017-07-08 remember17 Cocoa开发者社区7NSOperation的理解与使用 No.1:NSOperation简介 NSOperation是基于GCD之上的更高一层封装,NSOperation需要配合NSOperationQueue来实现多线程。 NSOperation实现多线程的步骤如下: 1. 创建任务&#x…

linux网卡绑定脚本
2013-08-20 15:30:51 此脚本适用于CentOS5.x和CentOS6.x。 #!/bin/bash #******************************************** # Copyright (c) Beijing DaoWoo Times Technology Co., Ltd. 2011 # # Author : Wu XuLei (wuxuleidaowoo.com) # FILE : bonding.sh …

EBS 抓trace 文件
如果要对FORM的操作做TRACE操作,可以使用 帮助->诊断->跟踪 中启用跟踪功能来实现。 但是如果要实现对并发请求的trace,需要在 系统管理员->并发->方案->定义 里找到对应的并发请求,并勾选”启用跟踪”项。然后提交这个并发请…

Kali Linux攻防系统(三:在Kali Linux系统中配置安全测试浏览器及系统清理备份)
任务三:配置安全测试浏览器及系统清理备份 3.1、汉化Firefox并安装安全插件 3.1.1、汉化Firefox浏览器,安装中文插件,并更改设置; 3.1.2、在浏览器附加组件管理器中查找“Web Developr”插件 3.1.3、安装添加附件组件 3.2、手动…

一篇文章学懂Shell脚本
Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用大量系统内部的功能来解释执行程序&#…

OC系列foundation Kit基础-NSDate
一.获取当前时间 1.1创建一个日期对象 NSDate *date [NSDate date];NSLog("%",date);输出结果: 2016-07-01 17:31:02.410 OCString[907:402963] 2016-07-01 09:31:02 0000 //因为时区不一样,需要格式化为本地时间 Program ended with exit…

sql server 中将由逗号“,”分割的一个字符串,转换为一个表,并应用与 in 条件...
select * from tablenmae where id in(1,2,3) 这样的语句和常用,但是如果in 后面的 1,2,3是变量怎么办呢,一般会用字符串连接的方式构造sql语句 string aa"1,2,3";string sqltxt"select * from tablename where id…

Nmap安装和扫描(一:Nmap安装和扫描基础知识点总结)
实验目的及要求 完成VMware Workstations14平台安装,会应用相关操作;完成Windows 7操作系统及Kali Linux操作系统的安装;掌握安全扫描的概念、意义及应用分析;掌握Nmap扫描器的安装;针对特定扫描目的,掌握…