当前位置: 首页 > 编程日记 > 正文

iOS-仿膜拜贴纸滚动(物理仿真)

导读

简单用OC写了一个小球滚动效果;
类似平衡球.

  • GitHub地址:https://github.com/wangliujiayou/WLBallView 欢迎Star.

膜拜滚动

进入正题-(传感器)

传感器是一种感应\检测装置, 目前已经广泛应用于智能手机上,用于感应\检测设备周边的信息,不同类型的传感器, 检测的信息也不一样

iOS中的传感器


传感器

一、CoreMotion框架介绍

iOS中的一个核心运动框架CoreMotion.framework,CoreMotion是一个专门处理Motion的框架,其中包含了两个部分加速度计和陀螺仪,在iOS4之前加速度计是由UIAccelerometer类来负责采集数据,加速计由三个坐标轴决定,用户最常见的操作设备的动作移动,晃动手机(摇一摇),倾斜手机都可以被设备检测到,加速计可以检测到线性的变化,陀螺仪可以更好的检测到偏转的动作,可以根据用户的动作做出相应的动作,iOS模拟器无法模拟以上动作,真机调试需要开发者账号。

二、CoreMotion数据获取

CoreMotion中获取数据主要是两种方式:

  • Push方式:
    提供一个线程管理器NSOperationQueue和一个回调BlockCoreMotion自动在每一个采样数据到来的时候回调这个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

物理的几种行为

  1. UIAttachmentBehavior 吸附行为

  2. UICollisionBehavior 碰撞行为

  3. UIGravityBehavior 重力行为

  4. UIPushBehavior 推力行为

  5. 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&#xff0c;postgresql9.4为例&#xff0c;使用yum方式进行介绍。 官网&#xff1a;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存储实现管理&#xff1b; 1.1、配置Git。在Git上创建microservice-study-config目录&#xff0c;并在目录中添加开发&#xff0c;预发布和测试的配置文件&#xff1b; 1.2、修改服务端配置文件。将microservice-config-server工程的配置文件中本地文件存储方式的配…

IOS 自定义相机, 使用 AVFoundation(附实现部分腾讯水印相机功能 demo)

原文链接&#xff1a;http://www.jianshu.com/p/c64bf543f16a这是一款使用 AVFoundation 自定义的相机&#xff0c;与系统原生相机有一样的外观但比系统的相机更好、更符合实际的开发需要、可以自己修改 UI、实现拍照、取消、闪光灯控制、前后摄像头控制、聚焦、放大缩小、拍照…

如何成为一个好的测试工程师(转载,大意)

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

ubuntu下7z文件的解压方法

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

Docker的使用(一:Docker入门程序)

1、编写Dockerfile文件&#xff1b; 注&#xff1a;创建一个空的Docker工作目录dockerspace&#xff0c;进而进入该目录&#xff0c;并创建编写dockerfile文件&#xff1b; 2、编写外部文件。 注&#xff1a;在当前目录&#xff08;dockerspace&#xff09;下分别创建require…

iOS OpenCV 图像灰度处理

2017-06-21 小溪彼岸 Cocoa开发者社区推荐人&#xff1a;wo709128079 有时候开发过程中&#xff0c;切图满足不了我们的需求&#xff0c;此时我们需要对图像进行灰度处理&#xff0c;例如QQ头像在线、离线等不同状态等。 可以尝试的解决方案&#xff1a; 第一种&#xff1a;让U…

【VS开发】【电子电路技术】RJ45以太网传输线研究

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

Wiz开发 定时器的使用与处理

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

Docker的使用(二:Docker客户端常用指令练习)

1、列出镜像&#xff1b; 2、搜索镜像&#xff1b; 3、拉取镜像&#xff1b; 4、构建镜像&#xff1b; 4.1、在Dockerfile文件所在目录构建镜像&#xff1b; 4.2、在其他目录构建镜像&#xff1b; 4.3、查看镜像是否构建成功&#xff1b; 5、删除镜像&#xff1b; 6、创建并启…

实现简书个人中心UI效果

这两天比较闲&#xff0c;简单实现了一下个人中心页面scrollView嵌套的效果&#xff0c;也就是下边这个页面,大家感受一下先&#xff1a; JSDemo2.gif 首先讲下实现思路&#xff0c;很多人看到这个界面觉得是多个scrollView嵌套实现的&#xff0c;其实苹果不推荐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&#xff1b; 2、修改镜像名称&#xff1b; 3、登录认证&#xff1b; 4、推送镜像&#xff1b; 5、查看验证&#xff1b;

啊里大鱼短信发送API

https://api.alidayu.com/doc2/apiDetail?spm0.0.0.0.SEe3dm&apiId25450 转载于:https://www.cnblogs.com/shiningrise/p/5626708.html

GCD API

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

查看Linux系统中某目录的大小

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

Docker的使用(四:Docker Registry本地私有仓库搭建知识点总结)

任务一&#xff1a; Docker Registry本地私有仓库搭建 1、启动Docker Registry&#xff1b; 2、重命名镜像&#xff1b; 3、推送镜像&#xff1b; 4、浏览器查看验证&#xff1b; 5、文件查看验证&#xff1b; 任务二&#xff1a;Docker Registry本地私有仓库配置&#xff1b;…

iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)

2017-07-08 remember17 Cocoa开发者社区目的 本文主要是分享iOS多线程的相关内容&#xff0c;为了更系统的讲解&#xff0c;将分为以下7个方面来展开描述。 多线程的基本概念 线程的状态与生命周期 多线程的四种解决方案&#xff1a;pthread&#xff0c;NSThread&#xff…

C基础知识小总结(十)

"如有不正确之处&#xff0c;请指出&#xff0c;谢谢" --Mood <指针和函数> 指针函数 函数指针 <最基本的使用函数指针> < 函数指针做为形参 > <字符指针> <字符数组> < 返回局部变量指针 > < 结构体指针> 指向结构体变…

支付方式(2)——支付宝集成及使用

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

Kali Linux攻防系统(一:攻防系统Kali Linux下载安装与更新)

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

iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(下)

2017-07-08 remember17 Cocoa开发者社区7NSOperation的理解与使用 No.1&#xff1a;NSOperation简介 NSOperation是基于GCD之上的更高一层封装&#xff0c;NSOperation需要配合NSOperationQueue来实现多线程。 NSOperation实现多线程的步骤如下&#xff1a; 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操作&#xff0c;可以使用 帮助->诊断->跟踪 中启用跟踪功能来实现。 但是如果要实现对并发请求的trace&#xff0c;需要在 系统管理员->并发->方案->定义 里找到对应的并发请求&#xff0c;并勾选”启用跟踪”项。然后提交这个并发请…

Kali Linux攻防系统(三:在Kali Linux系统中配置安全测试浏览器及系统清理备份)

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

一篇文章学懂Shell脚本

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

OC系列foundation Kit基础-NSDate

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

sql server 中将由逗号“,”分割的一个字符串,转换为一个表,并应用与 in 条件...

select * from tablenmae where id in(1,2,3) 这样的语句和常用&#xff0c;但是如果in 后面的 1&#xff0c;2&#xff0c;3是变量怎么办呢&#xff0c;一般会用字符串连接的方式构造sql语句 string aa"1,2,3";string sqltxt"select * from tablename where id…

Nmap安装和扫描(一:Nmap安装和扫描基础知识点总结)

实验目的及要求 完成VMware Workstations14平台安装&#xff0c;会应用相关操作&#xff1b;完成Windows 7操作系统及Kali Linux操作系统的安装&#xff1b;掌握安全扫描的概念、意义及应用分析&#xff1b;掌握Nmap扫描器的安装&#xff1b;针对特定扫描目的&#xff0c;掌握…