首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UICollisionBehavior忽略屏幕边缘

UICollisionBehavior忽略屏幕边缘
EN

Stack Overflow用户
提问于 2021-04-09 08:41:29
回答 1查看 19关注 0票数 1

我有几个UIViews连续地在屏幕上移动。使用UICollisionBehavior,我可以防止视图相互碰撞,但我需要它们穿过屏幕的边缘(上、左、右、下)。在下面的示例中,一旦它们到达屏幕的底部边缘,它们就会彼此弹开,然后最终就会坐在那里。我尝试对UIViews进行子类化,看看冲突是否只适用于子类类型,但这不起作用。

我如何防止UIViews相互碰撞,同时仍然让它们穿过屏幕的边缘?

子类:

代码语言:javascript
复制
class CollisionView: UIView { // nothing special happens here except it's a subclass
}

代码:

代码语言:javascript
复制
lazy var redView: CollisionView = {
    let view = CollisionView()
    view.backgroundColor = .red
    return view
}()

lazy var blueView: CollisionView = {
    let view = CollisionView()
    view.backgroundColor = .blue
    return view
}()

lazy var yellowView: CollisionView = {
    let view = CollisionView()
    view.backgroundColor = .yellow
    return view
}()

lazy var purpleView: CollisionView = {
    let view = CollisionView()
    view.backgroundColor = .purple
    return view
}()

lazy var greenView: CollisionView = {
    let view = CollisionView()
    view.backgroundColor = .green
    return view
}()

var arr = [CollisionView]()

var animator: UIDynamicAnimator!
var gravity: UIGravityBehavior!
var collider: UICollisionBehavior!
var bouncingBehavior  : UIDynamicItemBehavior!

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .white
    
    addSubViews()
    
    addAnimatorAndBehaviors()
}

func addAnimatorAndBehaviors() {
    
    animator = UIDynamicAnimator(referenceView: self.view)
    
    gravity = UIGravityBehavior(items: arr)
    animator.addBehavior(gravity)
    
    collider = UICollisionBehavior(items: arr)
    collider.translatesReferenceBoundsIntoBoundary = true
    animator.addBehavior(collider)
    
    bouncingBehavior = UIDynamicItemBehavior(items: arr)
    bouncingBehavior.elasticity = 0.75
    animator.addBehavior(bouncingBehavior)
}

func addSubViews() {
    
    let size = CGSize(width: 50, height: 50)
    
    redView.frame = CGRect(origin: view.center, size: size)
    blueView.frame = CGRect(origin: view.center, size: size)
    yellowView.frame = CGRect(origin: view.center, size: size)
    purpleView.frame = CGRect(origin: view.center, size: size)
    greenView.frame = CGRect(origin: view.center, size: size)
    
    view.addSubview(redView)
    view.addSubview(blueView)
    view.addSubview(yellowView)
    view.addSubview(purpleView)
    view.addSubview(greenView)
    
    arr = [redView, blueView, yellowView, purpleView, greenView]
}
EN

回答 1

Stack Overflow用户

发布于 2021-04-09 09:04:24

简单的修复,我只需要添加:

代码语言:javascript
复制
collider.collisionMode = .items

CollisionView子类是不必要的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67013577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档