实现碰撞的效果,接下来我们将提到一个托付方法: – (void)collisionBehavior:(UICollisionBehavior *)behavior beganContactForItem )item withBoundaryIdentifier:(id<NSCopying>)identifier a tPoint:(CGPoint)p; 这种方法是在边界发生碰撞的时候才去运行的 UICollisionBehavior UICollisionBehaviorDelegate> { UIDynamicAnimator * _animator; UIGravityBehavior * _gravity; UICollisionBehavior .m 仍在viewController中 - (void)collisionBehavior:(UICollisionBehavior *)behavior beganContactForItem: %@",p.x,p.y,identifier); } 小知识补充: UICollisionBehavior的属性中有一个叫做action的属性 @property (nonatomic,copy)void
常用的UIDynamicBehavior有: UIGravityBehavior 重力行为 UICollisionBehavior 碰撞行为 UIAttachmentBehavior 附着行为 2.UICollisionBehavior (碰撞行为) 在上述代码中,_someView视图会因为重力作用,直接掉出屏幕外。 *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[_someView]]; //设置碰撞边界有如下几张方式: *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[_someView]]; //设置碰撞边界为referenceView *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[_someView]]; //设置碰撞边界为referenceView
animator = UIDynamicAnimator(referenceView: box) // 添加碰撞行为 let collision = UICollisionBehavior UICollisionBehavior解析如下: @available(iOS 7.0, *) @MainActor open class UICollisionBehavior : UIDynamicBehavior { get } // 仅仅和边界进行碰撞 public static var boundaries: UICollisionBehavior.Mode { get } // 物理元素间和边界都进行碰撞 public static var everything: UICollisionBehavior.Mode { get } } // 两个物理元素间开始产生碰撞时调用 @available(iOS 7.0, *) optional func collisionBehavior(_ behavior: UICollisionBehavior
UICollectionViewLayoutAttributes类默认也遵守UIDynamicItem协议 物理仿真行为 UIDynamic提供了以下几种物理仿真行为 UIGravityBehavior:重力行为 UICollisionBehavior /量级(用来控制加速度,1.0代表加速度是1000 points /second²) @property (readwrite, nonatomic) CGFloat magnitude; 碰撞行为(UICollisionBehavior ) 简介 可以让物体之间实现碰撞效果 可以通过添加边界(boundary),让物理碰撞局限在某个空间中 UICollisionBehavior边界相关的方法 - (void)addBoundaryWithIdentifier identifier; @property (nonatomic, readonly, copy) NSArray* boundaryIdentifiers; - (void)removeAllBoundaries; UICollisionBehavior
物理引擎之间的中介,将Behavior对象添加到Animator即可实现动力仿真 UIDynamicBehavior:仿真行为,是动力学行为的父类,基本的动力学行为类UIGravityBehavior、UICollisionBehavior UIDynamicItem>)item; 4.设置重力方向和力度 - (void)setAngle:(CGFloat)angle magnitude:(CGFloat)magnitude; ---- 三、UICollisionBehavior collision.collisionDelegate = self; 1.一个动力项碰到另一个动力项: (1)一个动力项开始碰到另一个动力项时调用 - (void)collisionBehavior:(UICollisionBehavior withItem:(id <UIDynamicItem>)item2 atPoint:(CGPoint)p; (2)一个动力项结束碰到另一个动力项时调用 - (void)collisionBehavior:(UICollisionBehavior >)item1 withItem:(id <UIDynamicItem>)item2; 2.动力项和边界的碰撞: (1)动力项开始碰到某个边界 - (void)collisionBehavior:(UICollisionBehavior
添加另一个属性在 ViewController.swift var collision: UICollisionBehavior! 在viewDidLoad:下面添加这几行: collision = UICollisionBehavior(items: [square]) collision.translatesReferenceBoundsIntoBoundary 让对象响应碰撞 为了使正方形与障碍碰撞,找到初始化碰撞行为的代码并将其替换为以下内容: collision = UICollisionBehavior(items: [square, barrier]) 看不见的边界和碰撞 将碰撞行为初始化更改回其原始形式,以便仅识别方块: collision = UICollisionBehavior(items: [square]) 紧随此行后,添加以下内容: 中,在初始化碰撞对象之后将视图控制器设置为委托,如下所示: collision.collisionDelegate = self func collisionBehavior(_ behavior: UICollisionBehavior
为了将其保留在屏幕的边界内,您需要定义边界 var collision: UICollisionBehavior! collision = UICollisionBehavior(items: [square]) collision.translatesReferenceBoundsIntoBoundary = true 大多数行为可以与多个项目相关联,并且每个项目可以与多个行为相关联 五、使对象响应碰撞 为了使square与障碍物相撞,请找到初始化碰撞行为的行,并将其替换为以下内容: collision = UICollisionBehavior 跟障碍物交互不是很正确,障碍物应该不可移动,更奇怪的是障碍物从屏幕的底部反弹,并不像square那样沉稳,因为重力行为与障碍物无关 六、隐形边界和碰撞 将碰撞行为初始化更改回最初 collision = UICollisionBehavior ViewController: UIViewController, UICollisionBehaviorDelegate { 添加一个协议方法 func collisionBehavior(_ behavior: UICollisionBehavior
3.3 碰撞效果 碰撞的计算是UICollisionBehavior提供的,与重力较为类似。不同的是,由于碰撞需要轮廓信息,默认的碰撞轮廓是外接矩形或内接圆,实际体验较差,不够真实。