Skip to content

18.3_实现碰撞(UICollisionBehavior)效果

碰撞效果实现指南 🚀

碰撞(UICollisionBehavior)是 UIDynamicAnimator 中一个非常酷炫的功能,它能让你的视图像真实世界中的物体一样发生碰撞!准备好让你的 App 动起来了吗?让我们一起探索如何实现它吧!

碰撞行为基础

UICollisionBehavior 允许你定义视图之间的碰撞边界。你可以设置视图与视图之间的碰撞,也可以设置视图与屏幕边界的碰撞。这就像给你的视图添加了物理属性,让它们在屏幕上“活”起来。

  • 创建碰撞行为:首先,你需要创建一个 UICollisionBehavior 实例,并将需要参与碰撞的视图添加到这个行为中。
  • 设置碰撞边界:你可以使用 translatesReferenceBoundsIntoBoundary 属性让视图与屏幕边界发生碰撞,或者使用 addBoundary(withIdentifier:from:to:) 方法自定义碰撞边界。

代码实战:让视图撞起来!

让我们通过一个简单的例子来演示如何实现碰撞效果。假设我们有两个视图,我们希望它们在屏幕上自由移动并相互碰撞。

  1. 创建视图:首先,创建两个 UIView 实例,并设置它们的初始位置和大小。
  2. 创建 UIDynamicAnimator:创建一个 UIDynamicAnimator 实例,并将它与你的视图控制器关联起来。
  3. 创建 UIGravityBehaviorUICollisionBehavior:分别创建 UIGravityBehaviorUICollisionBehavior 实例,并将视图添加到这两个行为中。
  4. 添加行为到 UIDynamicAnimator:将 UIGravityBehaviorUICollisionBehavior 添加到 UIDynamicAnimator 中,让它们开始工作。
swift
let squareView = UIView(frame: CGRect(x: 100, y: 100, width: 50, height: 50))
squareView.backgroundColor = .red
view.addSubview(squareView)

let anotherView = UIView(frame: CGRect(x: 200, y: 150, width: 80, height: 80))
anotherView.backgroundColor = .blue
view.addSubview(anotherView)

animator = UIDynamicAnimator(referenceView: view)

let gravity = UIGravityBehavior(items: [squareView, anotherView])
animator.addBehavior(gravity)

let collision = UICollisionBehavior(items: [squareView, anotherView])
collision.translatesReferenceBoundsIntoBoundary = true // 与屏幕边界碰撞
animator.addBehavior(collision)

自定义碰撞边界

除了与屏幕边界碰撞,你还可以自定义碰撞边界。这可以通过 addBoundary(withIdentifier:from:to:) 方法实现。例如,你可以在屏幕中间添加一条无形的墙,让视图在碰到这条墙时反弹。

swift
collision.addBoundary(withIdentifier: "barrier" as NSCopying, from: CGPoint(x: 0, y: 300), to: CGPoint(x: view.bounds.width, y: 300))

碰撞代理

UICollisionBehavior 还有一个代理方法 collisionBehavior(_:beganContactFor:with:at:),你可以在这个方法中监听碰撞事件,并执行一些自定义操作。例如,你可以在碰撞发生时播放一个音效,或者改变视图的颜色。

swift
collision.collisionDelegate = self

func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem, with otherItem: UIDynamicItem, at p: CGPoint) {
    print("碰撞发生啦!🎉")
    // 在这里添加你的自定义操作
}

优化碰撞效果

为了让碰撞效果更加真实,你可以调整视图的弹性(elasticity)和摩擦力(friction)。这些属性可以通过 UIDynamicItemBehavior 来设置。

swift
let itemBehavior = UIDynamicItemBehavior(items: [squareView, anotherView])
itemBehavior.elasticity = 0.6 // 弹性
itemBehavior.friction = 0.4   // 摩擦力
animator.addBehavior(itemBehavior)

通过调整这些参数,你可以创造出各种各样的碰撞效果,让你的 App 更加生动有趣!希望你能享受这个探索的过程! 🥳

本站使用 VitePress 制作