在OC上使用UIDynamic和Swift3.0 差不多一樣的方法,可能UIDynamic已經(jīng)夠簡潔,但是要寫出棒棒噠的效果還是需要很多的組合行為才能實現(xiàn)。
//聲明一個物理仿真器
var dynamicAnimator = UIDynamicAnimator()
//聲明一個數(shù)組里面全是imageView, 做仿真運動時可以叫做物體,便于理解
var imageArray = Array<UIImageView>()
// MARK -- image 這個iamgeV單獨做阻尼運動
let imageV: UIImageView = {
let ima = UIImageView()
ima.frame = CGRect(x: 0, y: 200, width: 40, height: 40)
ima.layer.cornerRadius = 20
ima.backgroundColor = UIColor.gray
ima.layer.masksToBounds = true
return ima
}()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = UIColor.black
//初始話物理仿真器,并且設(shè)置作用范圍是整個視圖
dynamicAnimator = UIDynamicAnimator(referenceView: self.view)
//創(chuàng)建8個圓形物體,并且添加在數(shù)組上
for index in 0...7 {
let imageV = UIImageView()
imageV.frame = CGRect(x: (index % 4) * 70, y: (index / 4) * 70 + 64, width: 60, height: 60)
self.view.addSubview(imageV)
imageV.backgroundColor = index / 4 == 0 ? UIColor.red : UIColor.green
imageV.layer.cornerRadius = 30
imageV.layer.masksToBounds = true
imageArray.append(imageV)
}
self.view.addSubview(imageV)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//這里你可以一個一個的嘗試行為,找到自己要實現(xiàn)的效果
// 聲明一個重力行為,加在物體上,這里Items:后面是一個數(shù)組, 可以使用[imageV]單個物體,也可想我一樣使用數(shù)組,下面的items都一樣
let graviteImage = UIGravityBehavior(items: imageArray)
//添加一個重力加速度為10的重力
graviteImage.magnitude = 8
//添加一個矢量方向, dx:1, dy: 1 表示45度方向 就是x為1,y為1,這個方向就是他們的四邊形的對角線方向
graviteImage.gravityDirection = CGVector.init(dx: 1, dy: 1)
//將重力行為加在物理仿真器上
dynamicAnimator.addBehavior(graviteImage)
//聲明一個碰撞行為,加在物體上
let collison = UICollisionBehavior(items: imageArray)
//這個約束是在這個物理仿真器所在的view的邊界是否形成碰撞邊界
collison.translatesReferenceBoundsIntoBoundary = true
//碰撞行為有一個代理,里面的方法是開始行為,結(jié)束行為等等時刻
collison.collisionDelegate = self
//將碰撞行為加在仿真器上
dynamicAnimator.addBehavior(collison)
//此時我們的物體沒有物理屬性,碰撞后都不會回彈不是很真實
//所以給物體添加屬性
let imageVLetter = UIDynamicItemBehavior(items: imageArray)
//物體彈性0-1 0沒有彈性,1 表示可以回彈到初始位置,但是我們物體上還有重力作用所以是不會回到初始位置的
imageVLetter.elasticity = 1
//密度 0~
imageVLetter.density = 3
//阻力
imageVLetter.resistance = 0.5
//摩擦力 0~
imageVLetter.friction = 0.3
//角阻力
imageVLetter.angularResistance = 0.2
//將屬性加在仿真器上
dynamicAnimator.addBehavior(imageVLetter)
//最后我們添加一下吸附行為,這個行為只能添加在一個物體上,屬性也只有一個阻尼 snapTo:這個點就是吸附點,力量來自這里,阻尼就是牽引物體過來的力量,反彈
let snapBeheavior = UISnapBehavior(item: imageV, snapTo: CGPoint(x: 160, y: 400))
//阻尼,
snapBeheavior.damping = 0.1
//將吸附行為加在仿真器上
dynamicAnimator.addBehavior(snapBeheavior)
//上面所以的行為都可以刪除
// dynamicAnimator.removeBehavior(snapBheavior)
//dynamicAnimator.removeBehavior(imageVLetter)
}
//下面是代理方法 開始,結(jié)束
func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, at p: CGPoint) {
print("1 beganContactFor")
}
func collisionBehavior(_ behavior: UICollisionBehavior, endedContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?) {
print("2 endedContactFor")
}
我這里全當(dāng)拋磚引玉
最后祝大家圣誕快樂!!!