iOS 之物理仿真引擎-UIDynamic简介(二)

【UIDynamic-动力学-简介 Objective-C语言】 阅读详情

一、重力行为

说明:给定重力方向、加速度,让物体朝着重力方向掉落

1.方法

(1)UIGravityBehavior的初始化

  - (instancetype)initWithItems:(NSArray *)items;

    item参数 :里面存放着物理仿真元素

 

(2)UIGravityBehavior常见方法

  - (void)addItem:(id <UIDynamicItem>)item;

    添加1个物理仿真元素

  - (void)removeItem:(id <UIDynamicItem>)item;

    移除1个物理仿真元素

 

2.UIGravityBehavior常见属性

@property (nonatomic, readonly, copy) NSArray* items;

  添加到重力行为中的所有物理仿真元素

@property (readwrite, nonatomic) CGVector gravityDirection;

  重力方向(是一个二维向量)

@property (readwrite, nonatomic) CGFloat angle;

  重力方向(是一个角度,以x轴正方向为0°,顺时针正数,逆时针负数)

@property (readwrite, nonatomic) CGFloat magnitude;

  量级(用来控制加速度,1.0代表加速度是1000 points /second²)

 

二、碰撞行为

1.简介

说明:可以让物体之间实现碰撞效果

  可以通过添加边界(boundary),让物理碰撞局限在某个空间中

 

2.UICollisionBehavior边界相关的方法

- (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier forPath:(UIBezierPath*)bezierPath;

- (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier fromPoint:(CGPoint)p1 toPoint:(CGPoint)p2;

- (UIBezierPath*)boundaryWithIdentifier:(id <NSCopying>)identifier;

- (void)removeBoundaryWithIdentifier:(id <NSCopying>)identifier;

@property (nonatomic, readonly, copy) NSArray* boundaryIdentifiers;

- (void)removeAllBoundaries;

 

3.UICollisionBehavior常见用法

@property (nonatomic, readwrite) BOOL translatesReferenceBoundsIntoBoundary;

  是否以参照视图的bounds为边界

- (void)setTranslatesReferenceBoundsIntoBoundaryWithInsets:(UIEdgeInsets)insets;

  设置参照视图的bounds为边界,并且设置内边距

@property (nonatomic, readwrite) UICollisionBehaviorMode collisionMode;

  碰撞模式(分为3种,元素碰撞、边界碰撞、全体碰撞)

@property (nonatomic, assign, readwrite) id <UICollisionBehaviorDelegate> collisionDelegate;

  代理对象(可以监听元素的碰撞过程)

 

三、代码示例

在storyboard中拖拽几个控件,用于测试。

  

测试代码:

YYViewController.m文件  

复制代码
  1 //
  2 //  YYViewController.m
  3 //  12-重力行为和碰撞行为
  4 //
  5 //  Created by apple on 14-8-6.
  6 //  Copyright (c) 2014年 yangyong. All rights reserved.
  7 //
  8 
  9 #import "YYViewController.h"
 10 
 11 @interface YYViewController ()
 12 @property (weak, nonatomic) IBOutlet UIView *redView;
 13 
 14 @property (weak, nonatomic) IBOutlet UIProgressView *block1;
 15 @property (weak, nonatomic) IBOutlet UISegmentedControl *block2;
 16 
 17 @property(nonatomic,strong)UIDynamicAnimator *animator;
 18 @end
 19 
 20 @implementation YYViewController
 21 -(UIDynamicAnimator *)animator
 22 {
 23     if (_animator==nil) {
 24         //创建物理仿真器(ReferenceView:参照视图,设置仿真范围)
 25         self.animator=[[UIDynamicAnimator alloc]initWithReferenceView:self.view];
 26     }
 27     return _animator;
 28 }
 29 - (void)viewDidLoad
 30 {
 31     [super viewDidLoad];
 32     
 33     //设置红色view的角度
 34     self.redView.transform=CGAffineTransformMakeRotation(M_PI_4);
 35 }
 36 
 37 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 38 {
 39     //1.重力行为
 40 //    [self testGravity];
 41     //2.重力行为+碰撞检测
 42 //    [self testGravityAndCollsion];
 43     //3.测试重力的一些属性
 44     [self testGravityAndCollsion2];
 45     //用2根线作为边界
 46 //    [self testGravityAndCollision3];
 47     //4.用圆作为边界
 48 //    [self testGravityAndCollision4];
 49 }
 50 
 51 /**
 52  *  重力行为
 53  */
 54 -(void)testGravity
 55 {
 56     //1.创建仿真行为(进行怎样的仿真效果?)
 57     //重力行为
 58     UIGravityBehavior *gravity=[[UIGravityBehavior alloc]init];
 59     //2.添加物理仿真元素
 60     [gravity addItem:self.redView];
 61     //3.执行仿真,让物理仿真元素执行仿真行为
 62     [self.animator addBehavior:gravity];
 63 }
 64 /**
 65  *  重力行为+碰撞检测
 66  */
 67 -(void)testGravityAndCollsion
 68 {
 69     //1.重力行为
 70     UIGravityBehavior *gravity=[[UIGravityBehavior alloc]init];
 71     [gravity addItem:self.redView];
 72     
 73     //2碰撞检测行为
 74     UICollisionBehavior *collision=[[UICollisionBehavior alloc]init];
 75     [collision addItem:self.redView];
 76     [collision addItem:self.block1];
 77     [collision addItem:self.block2];
 78     
 79     //让参照视图的边框成为碰撞检测的边界
 80     collision.translatesReferenceBoundsIntoBoundary=YES;
 81     
 82     //3.执行仿真
 83     [self.animator addBehavior:gravity];
 84     [self.animator addBehavior:collision];
 85 }
 86 
 87 /**
 88  *  测试重力行为的属性
 89  */
 90 -(void)testGravityAndCollsion2
 91 {
 92     //1.重力行为
 93     UIGravityBehavior *gravity=[[UIGravityBehavior alloc]init];
 94     //(1)设置重力的方向(是一个角度)
 95 //    gravity.angle=(M_PI_2-M_PI_4);
 96     //(2)设置重力的加速度,重力的加速度越大,碰撞就越厉害
 97     gravity.magnitude=100;
 98     //(3)设置重力的方向(是一个二维向量)
 99     gravity.gravityDirection=CGVectorMake(0, 1);
100     [gravity addItem:self.redView];
101     
102     //2碰撞检测行为
103     UICollisionBehavior *collision=[[UICollisionBehavior alloc]init];
104     [collision addItem:self.redView];
105     [collision addItem:self.block1];
106     [collision addItem:self.block2];
107     
108     //让参照视图的边框成为碰撞检测的边界
109     collision.translatesReferenceBoundsIntoBoundary=YES;
110     
111     //3.执行仿真
112     [self.animator addBehavior:gravity];
113     [self.animator addBehavior:collision];
114     
115 }
116 
117 /**
118  *  用圆作为边界
119  */
120 - (void)testGravityAndCollision4
121 {
122     // 1.重力行为
123     UIGravityBehavior *gravity = [[UIGravityBehavior alloc] init];
124     [gravity addItem:self.redView];
125     
126     // 2.碰撞检测行为
127     UICollisionBehavior *collision = [[UICollisionBehavior alloc] init];
128     [collision addItem:self.redView];
129     
130     // 添加一个椭圆为碰撞边界
131     UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 320, 320)];
132     [collision addBoundaryWithIdentifier:@"circle" forPath:path];
133     
134     // 3.开始仿真
135     [self.animator addBehavior:gravity];
136     [self.animator addBehavior:collision];
137 }
138 
139 /**
140  *  用2根线作为边界
141  */
142 - (void)testGravityAndCollision3
143 {
144     // 1.重力行为
145     UIGravityBehavior *gravity = [[UIGravityBehavior alloc] init];
146     [gravity addItem:self.redView];
147     
148     // 2.碰撞检测行为
149     UICollisionBehavior *collision = [[UICollisionBehavior alloc] init];
150     [collision addItem:self.redView];
151     CGPoint startP = CGPointMake(0, 160);
152     CGPoint endP = CGPointMake(320, 400);
153     [collision addBoundaryWithIdentifier:@"line1" fromPoint:startP toPoint:endP];
154     CGPoint startP1 = CGPointMake(320, 0);
155     [collision addBoundaryWithIdentifier:@"line2" fromPoint:startP1 toPoint:endP];
156 //    collision.translatesReferenceBoundsIntoBoundary = YES;
157     
158     // 3.开始仿真
159     [self.animator addBehavior:gravity];
160     [self.animator addBehavior:collision];
161 }
162 @end
复制代码

一些测试效果:

  

代码补充说明:

(1)加速度

速度:point/s

加速度:point/s²

1\2 * 加速度 * t²

   gravity.magnitude = 1000; // 重力加速度越大,碰撞越厉害    

(2)重力的方向

  坐标如下:

  

重力方向(二维向量)

说明:给定坐标平面内的一个点。然后用原点(0,0)来连接它,就构成了一个向量。

注意:在IOS中以左上角为坐标原点,向右x增加,向下Y越大。

    

1     //(3)设置重力的方向(是一个二维向量)
2     gravity.gravityDirection=CGVectorMake(-1, 1);

重力方向为左下角(西南)方向

(3)碰撞检测行为

复制代码
1  UICollisionBehavior *collision = [[UICollisionBehavior alloc] init];
2     [collision addItem:self.redView];
3     CGPoint startP = CGPointMake(0, 160);
4     CGPoint endP = CGPointMake(320, 400);
5     [collision addBoundaryWithIdentifier:@"line1" fromPoint:startP toPoint:endP];
6     CGPoint startP1 = CGPointMake(320, 0);
7     [collision addBoundaryWithIdentifier:@"line2" fromPoint:startP1 toPoint:endP];
复制代码

注意:标识符不能写空。可以写字符串,因为需要标识符需要遵守NSCopying协议,而字符串满足要求。

(4)贝赛尔曲线

  

提示:这里的path是一个圆,设置宽高不一样,那么得出来的就是一个椭圆。

iOS实现浮动泡泡功能 http://blog.youkuaiyun.com/qq_15509071/article/details/71123323博客对应的代码 立即下载

相关推荐

SC7A20规格书(带寄存器描述).pdf

非常稀有的中文资源,士兰微 三轴传感器应用资料。详细描述了ic的资源,介绍了应用功能,功耗,规格参数,配置引脚,广泛用于 可穿戴,低功耗检测,领域,是性价比首选的方案。

iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)

iOS开发拓展篇—UIDynamic(重力行为+碰撞检测) 一、重力行为 说明:给定重力方向、加速度,让物体朝着重力方向掉落 1.方法 (1)UIGravityBehavior的初始化   - (instancetype)initWithItems:(NSArray *)items;     item参数 :里面存放着物理仿真元素   (2)UIGravityBehavior常见方...

weixin_34161064的博客 209

SC7A20 Datasheet_0.6_EN.pdf

SC7A20 Datasheet_0.6_EN.pdf

碰撞检测unity

如果与碰撞发生碰撞的物体名称为 “Sphere”,该函数将输出“Cube has collided with the Sphere!假设我们有两个物体,一个叫 Cube 和另一个叫 Sphere。为了检测它们是否发生碰撞,我们需要将一个碰撞器组件添加到每个物体上。这是一个简单的示例,演示了如何在 Unity 中检测物体间的碰撞。当然,这只是一个基本示例,您可以根据您的需求进行更复杂的碰撞检测。现在我们已经有了一个脚本来检测碰撞,我们需要将其附加到 Sphere 对象上以完成检测。

repair的博客 929

SC7A20说明书,GSENSOR

士兰微电子,SC7A20三轴加速度传感器芯片。芯片通过I2C/SPI接口与MCU通信。

SC7A20加速度传感器驱动C源码+SC7A20芯片DATASHEET说明书.zip

SC7A20加速度传感器驱动C源码+SC7A20芯片DATASHEET说明书 void G_Sensor_SC7A20_Init(u8 *Acc_Int_Thr) { u8 temp1; Sensor_Read_Byte(CHIPID,&temp1); USART1_printf("Chip_ID = %x\r\n", temp1); USART1_printf("G_Sensor_SC7A20_Init \r\n"); if(temp1 != 0x11)// I2C address fixed --> 读取系统ID,如果异常就需要重新写入原厂数据了 { USART1_printf("Error\r\n"); } /*click */ Sensor_Write_Byte(0x20,&SC7A20_REG[0]); //odr 10Hz Sensor_Write_Byte(0x21,&SC7A20_REG[1]); //fds -->开启高通滤波器(

iOS开发之 UIDynamic (动力效果)

一、UIDynamic入门须知 UIDynamic 是从iOS7 开始引入的一种新技术,属于UIKit框架,可以模拟现实生活中的物理现象,如碰撞、抖动、摆动等    1⃣️、动力效果就像是玩电吉他,电吉他有效果器 可以添加各种电子效果.动力效果,也有一个效果器,叫做动力效果器,里面可以添加动力效果  电吉他切换效果,会把上一个效果移除。动力效果也是一样  

ltj1171528192的博客 1254

SC7A20说明书_0.8(带寄存器描述)1

1.8V 兼容数字 IO 口 1.71 1.71 3.45

iOS 之物理仿真引擎-UIDynamic简介(一)

一、简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如:重力、弹性碰撞等现象   2.物理引擎的价值 广泛用于游戏开发,经典成功案例是“愤怒的小鸟” 让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果 提高了

Shicuf的专栏 793

车联网ECU、TSP与TBOX通信流程

对比维度ECU(电子控制单元)BMS(电池管理系统)应用场景传统燃油车 + 新能源汽车仅限新能源汽车核心作用控制整车各系统运行管理动力电池安全与寿命车联网角色数据采集与传输的核心载体提供电池相关的核心数据。

tecoes的博客 1230

P4语言实战:如何用Barefoot Tofino实现自定义网络协议(避坑指南)

本文是一份详尽的P4语言实战指南,重点讲解如何利用Barefoot Tofino可编程交换芯片实现自定义网络协议。内容涵盖从P4编程模型解析、自定义协议头定义,到匹配-动作流水线构建、性能优化及生产环境部署的全过程,并特别分享了在资源管理、字节序、调试技巧等方面的宝贵避坑经验,旨在帮助网络开发者和研究人员掌握数据平面编程的核心能力。

echo99的专栏 639

iOS 之物理仿真引擎-UIDynamic简介(三)

iOS开发拓展篇—UIDynamic(捕捉行为) 一、简介 可以让物体迅速冲到某个位置(捕捉位置),捕捉到位置之后会带有一定的震动 UISnapBehavior的初始化   - (instancetype)initWithItem:(id )item snapToPoint:(CGPoint)point;   UISnapBehavior常见属性   

Shicuf的专栏 376

【COMSOL】修改内置物理场方程 模拟水沸腾的蒸汽泡运动

在COMSOL中通过弱贡献(weak contribution)节点,可以向任何内置模型方程中添加约束。这里,以模拟水沸腾的蒸汽泡运动为例,来讲一讲当我们研究的方程与模块方程不一样时,应该怎么增加新的贡献项。

u012161192的博客 9007

iOS中UIDynamic物理仿真详解

本文中所有代码演示均有GitHub源码,点击下载 UIDynamic简介 简介: UIKit动力学最大的特点是将现实世界动力驱动的动画引入了UIKit,比如动力,铰链连接,碰撞,悬挂等效果,即将2D物理引擎引入了UIKit。注意:UIKit动力学的引入,并不是为了替代CA或者UIView动画,在绝大多数情况下CA或者UIView动画仍然是最有方案,只有在需要引入逼真的

cleven 952

STM32串口接收避坑指南:为什么你的USART_IT_IDLE中断不触发?附完整调试流程

本文深入解析STM32串口接收中断机制,特别是USART_IT_IDLE中断不触发的常见原因及解决方案。通过详细分析中断标志清除顺序、波特率配置、硬件连接等关键因素,并提供完整的调试流程和代码示例,帮助开发者快速定位并解决串口通信问题。

weixin_42519985的博客 346

从零开始:如何在STM32上搭建QP框架实现事件驱动开发(附完整代码)

本文详细介绍了如何在STM32嵌入式平台上从零开始搭建QP框架,实现事件驱动开发。通过对比传统前后台系统与RTOS的局限,深入剖析了QP框架基于活动对象和层次式状态机的核心优势,并提供了完整的环境配置、代码移植及一个智能灯光控制器的实战案例,帮助开发者构建清晰、可维护的复杂嵌入式应用。

weixin_29200741的博客 487

IOS开发之UI进阶(UIDynamic物理引擎)

UIDynamic UIKit动力学最大的特点是将现实世界动力驱动的动画引入了UIKit,比如重力,铰链连接,碰撞,悬挂等效果,即将2D物理引擎引入了UIKit 注意:UIKit动力学的引入,并不是为了替代CA或者UIView动画,在绝大多数情况下CA或者UIView动画仍然是最优方案,只有在需要引入逼真的交互设计的时候,才需要使用UIKit动力学它是作为现有交互设计和实现的一种补充 其他2D仿真引擎:BOX2DC语言框架免费;ChipmunkC语言框架免费,其他版本收费 UIDynamic三个重要

weixin_46926959的博客 1246

【yolo】YOLOv8模型导出完全指南:从PT到ONNX及其他格式的完整实践

摘要:本文全面介绍了YOLOv8模型从PT格式导出为ONNX等部署格式的完整流程与最佳实践。重点解析了关键参数(如format、imgsz、simplify)的作用机制,特别强调输入尺寸imgsz会自动继承训练尺寸的特性,并提供了ONNX、TensorRT等格式的典型导出配置方案。文章还总结了常见问题解决办法,推荐使用simplify优化模型性能,同时分享了通过C#实现模型重命名的实用技巧。最后指出"训练决定能力,导出定义接口"的核心原则,帮助开发者高效完成模型部署转换。

songhuangong123的博客 1917

UIDynamic 物理引擎

概念介绍 UIDynamic从ios7才开始有的,其他2D仿真引擎: BOX2D:C语言框架,免费 Chipmunk:C语言框架免费,其他版本收费(C#、Objective-C、Java) 必须遵守了UIDynamicItem协议的控件才能应用这些行为,UIView遵守了,所以所有控件都可以使用 使用步骤:创建一个动画者对象UIDynamicAnimator并设置坐标系,

ihoudf 1232

[RK3568 Android11] 开发之蓝牙(AP6275S)

前言 蓝牙是一种支持设备短距离通信(一般10m内)的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与因特网Internet之间的通信,从而数据传输变得更加迅速高效,为无线通信拓宽道路。 接下来是在RK3568上调试AP6275S模块蓝牙部分: 一、设备树dts配置 根据硬件原理图,找到对应的控制引脚,配置好dts: ...

~未来可期~ 4072

【推荐100个unity插件】性能极高的逼真爆炸、火焰和烟雾效果——UNI VFX

这是一篇关于Unity中高性能GPU粒子特效插件UNI VFX的使用指南。文章介绍了该插件提供逼真的爆炸、火焰和烟雾效果,支持URP和HDRP渲染管线。主要内容包括:插件安装方法(需预先安装Visual Effect Graph和Shader Graph包)、事件系统使用方法(如create/loop/stop等事件控制)、特效分类(自动结束型和持续型特效)、检视面板配置技巧以及性能优化建议(特别提醒灯光特效对性能的影响较大)。文末还推荐了多个Unity开发相关的专栏内容。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1487

iOS基础 - UIDynamic

一、UIKit动力学 UIKit动力学最大的特点是将现实世界动力驱动的动画引入了UIKit,比如重力,铰链连接,碰撞,悬挂等效果,即将2D物理引擎引入了UIKit 注意:UIKit动力学的引入,并不是为了替代CA或者UIView动画,在绝大多数情况下CA或者UIView动画仍然是最优方案,只有在需要引入逼真的交互设计的时候,才需要使用UIKit动力学它是作为现有交互设计和实现的一种补充 其他

847

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

UIDynamic——UIKit动力学

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33751566的博客 119

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SC7A20数据手册

SC7A20数据手册 【下载地址】SC7A20数据手册 SC7A20芯片数据手册提供了全面的技术规格和功能描述,涵盖引脚配置、电气特性等关键信息,是硬件设计和应用开发不可或缺的参考资料。这份手册为工程师提供了深入理解SC7A20芯片的途径,支持高效的系统集成和优化。无论是初学者还是资深开发者,都能从中获得实用指导,助力项...

gitblog_06780的博客 659

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【免费下载】 SC7A20三轴加速度传感器芯片说明书

SC7A20三轴加速度传感器芯片说明书 去发现同类优质开源项目:https://gitcode.com/ 简介 本仓库提供士兰微电子(Silan Microelectronics)生产的SC7A20三轴加速度传感器芯片的说明书下载。SC7A20是一款高性能的三轴加速度传感器芯片,广泛应用于各种需要检测物体运动状态的设备中。 资源文件 文件名: SC7A20说明书.pdf 文件描述: 该说明书详细...

gitblog_06654的博客 1453
上一篇: iOS 之物理仿真引擎-UIDynamic简介(一)
下一篇: iOS 之物理仿真引擎-UIDynamic简介(三)
Shicuf
博客等级 码龄16年 11粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值