重力碰撞

#import "ViewController.h" @interface ViewController ()<UIDynamicAnimatorDelegate,UICollisionBehaviorDelegate> { UIDynamicAnimator *animator; UIView *view; UIView *view2;} @end @implementation ViewController - ( void )viewDidLoad { [ super viewDidLoad]; // UIDynamicAnimator /* UIDynamic是从ios7开始引入的一种新技术 属于UIKit框架 可以模拟现实生活中的物理现象 如碰撞 抖动 摆动 等 动力效果:如动吉他,电吉他有效果器 可以添加各种电子效果 动力效果也有一个效果器,叫做动力效果器,里面可以添加动力效果 电吉他可以叠加多个效果 动力效果也是一样 动力效果的使用步骤: 1、创建动力效果器(UIDynamicAnimator) 2、创建动力效果(Behavior)添加到对应的视图上 3、将动力效果添加到动力效果器中开始动力效果 再是用动力效果的时候必须遵守UIDynamicItem这个协议才可以使用动力效果 UIView默认遵守了UIDynamicItem协议 UIDynamic提供的动力效果 UIGravityBehavior:重力效果 UICollisionBehavior:碰撞效果 UIDynamicItemBehavior:动力元素效果 UIPushBehavior:推动效果 UISnapBehavior:迅速移动效果 UIAttachmentBehavior:附着效果 都继承自UIDynamicBehavior 动力效果器:UIDynamicAnimator 可以把UIDynamicAnimator看做动力效果的容器 它制定了动力效果的有效范围 在初始化的时候可以指定他的有效范围 - (instancetype)initWithReferenceView:(UIView*)view; 作用在哪一个view上 哪一个view就是他产生动力效果的有效范围 既然是容器 他还可以添加移除 动力效果 - (void)addBehavior:(UIDynamicBehavior *)behavior; 添加动力效果 - (void)removeBehavior:(UIDynamicBehavior *)behavior; 移除动力效果 - (void)removeAllBehaviors; 移除之前添加过的所有动力效果 动力效果器常用的属性 @property (nonatomic, readonly) UIView* referenceView;作用的区域 @property (nonatomic, readonly, copy) NSArray* behaviors;添加到效果器中的所有效果 @property (nonatomic, readonly, getter = isRunning) BOOL running;是否正在进行 @property (nonatomic, assign) id <UIDynamicAnimatorDelegate> delegate;可以检测开始暂停 - (void)dynamicAnimatorWillResume:(UIDynamicAnimator*)animator; - (void)dynamicAnimatorDidPause:(UIDynamicAnimator*)animator; */ animator = [[UIDynamicAnimator alloc]initWithReferenceView: self .view ]; // self.view是产生动力效果的区域 animator .delegate = self ; view = [[ UIView alloc]initWithFrame:CGRectMake( 0 , 0 , 100 , 100 )]; view .layer .cornerRadius = 50 ; view .backgroundColor = [ UIColor colorWithRed: 0.345 green: 1.000 blue: 0.391 alpha: 1.000 ]; [ self .view addSubview:view]; view2 = [[ UIView alloc]initWithFrame:CGRectMake( 50 , 200 , 100 , 100 )]; view2 .layer .cornerRadius = 50 ; view2 .backgroundColor = [ UIColor colorWithRed: 1.000 green: 0.282 blue: 0.298 alpha: 1.000 ]; [ self .view addSubview:view2]; /* 碰撞效果 UICollisionBehavior 可以让物体之间实现碰撞效果 也可以通过添加边界(boundary)在边界实现碰撞效果 边界相关的方法 - (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier forPath:(UIBezierPath*)bezierPath; 添加一个贝塞尔曲线路径的边界 - (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier fromPoint:(CGPoint)p1 toPoint:(CGPoint)p2; 通过添加两个点连成的线 作为边界 - (UIBezierPath*)boundaryWithIdentifier:(id <NSCopying>)identifier; 通过ID找到边界路径 - (void)removeBoundaryWithIdentifier:(id <NSCopying>)identifier; 移除ID对应的边界 @property (nonatomic, readonly, copy) NSArray* boundaryIdentifiers; 边界数组 - (void)removeAllBoundaries;移除所有边界 碰撞的方式 typedef NS_OPTIONS(NSUInteger, UICollisionBehaviorMode) { UICollisionBehaviorModeItems = 1 << 0,元素碰撞 UICollisionBehaviorModeBoundaries = 1 << 1,边界碰撞 UICollisionBehaviorModeEverything = NSUIntegerMax 全体碰撞 } NS_ENUM_AVAILABLE_IOS(7_0); // 视图碰撞边界的时候 触发 - (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(id <NSCopying>)identifier atPoint:(CGPoint)p; - (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(id <NSCopying>)identifier; //两个元素相互碰撞 - (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2 atPoint:(CGPoint)p; - (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2; */ } #pragma mark 动力效果器的代理方法 //启动 - ( void )dynamicAnimatorWillResume:(UIDynamicAnimator*)animator{} //暂停 - ( void )dynamicAnimatorDidPause:(UIDynamicAnimator*)animator{} #pragma mark 手指触摸屏幕添加动力效果 - ( void )touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch = [touches anyObject]; CGPoint touchPoint = [touch locationInView: self .view ]; view .center = touchPoint;}- ( void )touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ #pragma mark 重力效果 // 把之前添加过的重力效果移除 [animator removeAllBehaviors]; // 初始化重力效果 UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc]initWithItems:@[view]]; // 设置掉落方向 gravityBehavior .gravityDirection = CGVectorMake( 0 , 1 ); // 设置加速度 数值越大 碰撞效果越大 gravityBehavior .magnitude = 1 ; // 添加到效果器里面 [animator addBehavior:gravityBehavior]; #pragma mark 碰撞效果 /*// 初始化碰撞效果的对象 ,并给View添加碰撞的效果 UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc]initWithItems:@[view]];// 把动力效果器的范围当做边界 collisionBehavior.translatesReferenceBoundsIntoBoundary = YES; collisionBehavior.collisionDelegate = self;#pragma mark 通过两个点画一条线当做边界// [collisionBehavior addBoundaryWithIdentifier:@"line" fromPoint:CGPointMake(0, 300) toPoint:CGPointMake(100, 600)];// [collisionBehavior addBoundaryWithIdentifier:@"line1" fromPoint:CGPointMake(375, 300) toPoint:CGPointMake(275, 600)];#pragma mark 通过一个圈来当做边界 UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 200, 375, 375)]; [collisionBehavior addBoundaryWithIdentifier:@"圆形" forPath:path]; [animator addBehavior:collisionBehavior]; */ #pragma mark 两个视图之间的碰撞 UICollisionBehavior *coll = [[UICollisionBehavior alloc]initWithItems:@[view,view2]]; coll .translatesReferenceBoundsIntoBoundary = YES ; // 如果是两个元素之间相互碰撞 设置边界 也不起作用 coll .collisionMode = UICollisionBehaviorModeEverything; coll .collisionDelegate = self ; [animator addBehavior:coll];}- ( void )collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:( id <UIDynamicItem>)item1 withItem:( id <UIDynamicItem>)item2 atPoint:( CGPoint )p{}- ( void )collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:( id <UIDynamicItem>)item1 withItem:( id <UIDynamicItem>)item2{} #pragma mark 碰撞动力效果的代理方法 - ( void )collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:( id <UIDynamicItem>)item withBoundaryIdentifier:( id <NSCopying>)identifier atPoint:( CGPoint )p{ NSLog (@ "%f\n%f" ,p .x ,p .y );}- ( void )collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:( id <UIDynamicItem>)item withBoundaryIdentifier:( id <NSCopying>)identifier{}
技术选型 【后端】:Java 【框架】:springboot 【前端】:vue 【JDK版本】:JDK1.8 【服务器】:tomcat7+ 【数据库】:mysql 5.7+ 项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧! 在当今快速发展的信息技术领域,技术选型是决定一个项目成功与否的重要因素之一。基于以下的技术栈,我们为您带来了一份完善且经过实践验证的项目资源,让您在学习和提升编程技能的道路上事半功倍。以下是该项目的技术选型和其组件的详细介绍。 在后端技术方面,我们选择了Java作为编程语言。Java以其稳健性、跨平台性和丰富的库支持,在企业级应用中处于领导地位。项目采用了流行的Spring Boot框架,这个框架以简化Java企业级开发而闻名。Spring Boot提供了简洁的配置方式、内置的嵌入式服务器支持以及强大的生态系统,使开发者能够更高效地构建和部署应用。 前端技术方面,我们使用了Vue.js,这是一个用于构建用户界面的渐进式JavaScript框架。Vue以其易上手、灵活和性能出色而受到开发者的青睐,它的组件化开发思想也有助于提高代码的复用性和可维护性。 项目的编译和运行环境选择了JDK 1.8。尽管Java已经推出了更新的版本,但JDK 1.8依旧是一种成熟且稳定的选择,广泛应用于各类项目中,确保了兼容性和稳定性。 在服务器方面,本项目部署在Tomcat 7+之上。Tomcat是Apache软件基金会下的一个开源Servlet容器,也是应用最为广泛的Java Web服务器之一。其稳定性和可靠的性能表现为Java Web应用提供了坚实的支持。 数据库方面,我们采用了MySQL 5.7+。MySQL是一种高效、可靠且使用广泛的关系型数据库管理系统,5.7版本在性能和功能上都有显著的提升。 值得一提的是,该项目包含了前后台的完整源码,并经过严格调试,确保可以顺利运行。通过项目的学习和实践,您将能更好地掌握从后端到前端的完整开发流程,提升自己的编程技能。欢迎参考博主的详细文章或私信获取更多信息,利用这一宝贵资源来推进您的技术成长之路!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值