2016-11-15 70 views
-1

對你來說可能是一件容易的事。如何正確使用CollisionBehavior使物品相互碰撞

我只是想用正確的方式使用collisionMode。我的代碼似乎沒問題(沒有錯誤),但項目只與視圖的邊界相沖突。不與對方。

我想知道「translatesReferenceBoundsIntoBoundary」是否會覆蓋collisionMode。

也許我應該使用「addBoundary(withIdentifier:NSCopying,from:CGPoint,to:CGPoint)」方法而不是「translateReferenceBoundsIntoBoundary」,但沒有找到如何實現NSCopying類。

下面我的代碼細節。

在此先感謝。

import UIKit 

class ViewController: UIViewController { 

var tests:[String] = ["test1","test2","test3","test4","test5","test6","test7","test8","test9","test10","test11"] 

var label:UILabel! 
var color:UIColor! 

var dynamicBehavior:UIDynamicBehavior! 
var collisionBehavior:UICollisionBehavior! 

var animatorArray = [UIDynamicAnimator]() 


var countLabel = 0 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let size:CGFloat = 50.0 
    var positionX:CGFloat = 60.0 
    var positionY:CGFloat = 100.0 


    for test in tests { 
    label = UILabel(frame:CGRect(x: positionX, y: positionY, width: size, height: size)) 
    label.center = CGPoint(x: positionX, y: positionY) 
    label.layer.cornerRadius = size * 0.5 
    label.layer.masksToBounds = true 
    label.backgroundColor = color 
    label.textAlignment = .center 
    label.textColor = UIColor.white 
    label.adjustsFontSizeToFitWidth = true 
    label.numberOfLines = 1 
    label.text = test 
    self.view.addSubview(label) 
    countLabel = countLabel + 1 

     if countLabel == 4 || countLabel == 8 { 
      positionX = positionX - 140 
      positionY = positionY + 100 } 
     else { positionX = positionX + 60} 

    for (i,_) in tests.enumerated() { 

     let gravity = UIGravityBehavior(items: [label]) 
     let direction = CGVector(dx: 0.0, dy: 1.0) 
     gravity.gravityDirection = direction 

     let bounce = UIDynamicItemBehavior(items: [label]) 
     bounce.elasticity = 1.0 

     let collisions = UICollisionBehavior(items: [label]) 
     collisions.translatesReferenceBoundsIntoBoundary = true 
     collisions.collisionMode = UICollisionBehaviorMode.everything 

    animatorArray.append(UIDynamicAnimator(referenceView: self.view)) 
    animatorArray[i].addBehavior(bounce) 
    animatorArray[i].addBehavior(collisions) 
    animatorArray[i].addBehavior(gravity) 
    } 
} 

} 
} 
+0

夥計。 NSCopying只是一個字符串。 'coll.addBoundary(withIdentifier:「bottom」as NSString,from:p1,to:p2)' – matt

+0

謝謝matt。是的,的確很簡單。我正在尋找很遠。 – Bastien

+0

沒問題!而且我看到keithbhunter已經正確回答了你的實際問題,所以你應該很好走。 (你應該接受他的回答:他完全正確的構建你的循環。) – matt

回答

1

您的每一個標籤被添加到UIDynamicAnimator所有的行爲單獨實例一個單獨的實例在for循環。您只能製作動畫師的一個屬性和每個行爲,並將每個標籤添加到相同的動畫師和行爲中。這樣,動畫師負責所有的標籤,而不僅僅是一個。

+0

我明白你的意思是keithbhunter。我會試着弄清楚如何去做。 (我是面向對象編程的新手)。謝謝你的建議。 – Bastien