簡體   English   中英

UICollisionBehavior 忽略屏幕邊緣

[英]UICollisionBehavior Ignore Screen Edges

我有幾個 UIViews 在屏幕上不斷移動。 使用UICollisionBehavior我可以防止視圖相互碰撞,但我需要它們穿過屏幕的邊緣(頂部、左側、右側、底部)。 在下面的這個例子中,一旦它們碰到屏幕的底部邊緣,它們就會相互彈開,然后最終就坐在那里。 我試圖對 UIViews 進行子類化,並查看沖突是否僅適用於子類類型,但這不起作用。

如何防止 UIView 相互碰撞,但仍讓它們穿過屏幕邊緣?

子類:

class CollisionView: UIView { // nothing special happens here except it's a subclass
}

代碼:

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]
}

很容易解決,我只需要添加:

collider.collisionMode = .items

在此處輸入圖像描述

CollisionView 子類是不必要的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM