首先使用一个参考视图也可以理解为背景视图创建自动动画:
dynamicAnimator = UIDynamicAnimator(referenceView: self.view)并且我们创建两个一大一小的视图:
litterView = createGlobe(CGRectMake(145, 20, 50, 50), color: UIColor.yellowColor()) hugeView = createGlobe(CGRectMake(120, 300, 100, 100), color: UIColor.redColor()) self.view.addSubview(litterView!) self.view.addSubview(hugeView!) func createGlobe(frame:CGRect,color:UIColor) -> UIView{ let view = UIView (frame: frame) view.backgroundColor = color view.layer.borderColor = UIColor.greenColor().CGColor view.layer.cornerRadius = frame.size.width/2 view.layer.masksToBounds = true view.layer.borderWidth = 2 return view }然后我们给小的视图添加重力行为并设置加速度:
//重力行为 let gravite = UIGravityBehavior(items: [litterView!]) //加速度 gravite.magnitude = 5给大视图和小视图都添加碰撞行为
//碰撞行为 let collisionBehavior = UICollisionBehavior(items: [litterView!,hugeView!]) //用参考视图边界作为碰撞边界 collisionBehavior.translatesReferenceBoundsIntoBoundary = true collisionBehavior.collisionDelegate = self碰撞行为是有代理方法的,我们可以通过实现代理方法监听碰撞过程: 两个视图碰撞结束:
func collisionBehavior(behavior: UICollisionBehavior, endedContactForItem item1: UIDynamicItem, withItem item2: UIDynamicItem) { let color = hugeView!.backgroundColor hugeView!.backgroundColor = litterView!.backgroundColor litterView!.backgroundColor = color }视图开始与边界碰撞:
func collisionBehavior(behavior: UICollisionBehavior, beganContactForItem item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, atPoint p: CGPoint) { }视图结束与边界碰撞:
func collisionBehavior(behavior: UICollisionBehavior, endedContactForItem item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?) { }为了使效果看起来更加真实我们可以给视图添加一些物理属性: 给小视图添加弹性和密度值:
//物体属性行为包括弹性、摩擦力、密度、阻力等等 let litterBehavior = UIDynamicItemBehavior(items: [litterView!]) litterBehavior.elasticity = 0.6 //密度 litterBehavior.density = 2.2给大视图添加弹性、阻力和密度值:
let hugeBehavior = UIDynamicItemBehavior(items: [hugeView!]) //弹性 hugeBehavior.elasticity = 0.8 //阻力 hugeBehavior.resistance = 0.3 hugeBehavior.density = 12.2接下来我们再创建一个中型的视图并为它添加吸附行为:
middleView = createGlobe(CGRectMake(200, 100, 75, 75), color: UIColor.whiteColor()) self.view.addSubview(middleView!)创建吸附行为时要有视图和点这两个参数:
snapBheavior = UISnapBehavior(item: middleView!, snapToPoint: point!)我们还可以给吸附添加物理属性:
//阻尼 snapBheavior?.damping = 0.2下面是完整的demo代码:
// // ViewController.swift // 重力碰撞 // // Created by 句芒 on 16/8/16. // Copyright © 2016年 fanwei. All rights reserved. // import UIKit class ViewController: UIViewController,UICollisionBehaviorDelegate{ var dynamicAnimator = UIDynamicAnimator() var snapBheavior:UISnapBehavior? var litterView:UIView? var hugeView:UIView? var middleView:UIView? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. self.view.backgroundColor = UIColor.blackColor() dynamicAnimator = UIDynamicAnimator(referenceView: self.view) litterView = createGlobe(CGRectMake(145, 20, 50, 50), color: UIColor.yellowColor()) middleView = createGlobe(CGRectMake(200, 100, 75, 75), color: UIColor.whiteColor()) hugeView = createGlobe(CGRectMake(120, 300, 100, 100), color: UIColor.redColor()) self.view.addSubview(litterView!) self.view.addSubview(hugeView!) self.view.addSubview(middleView!) } override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { //重力行为 let gravite = UIGravityBehavior(items: [litterView!]) //加速度 gravite.magnitude = 5 //碰撞行为 let collisionBehavior = UICollisionBehavior(items: [litterView!,hugeView!,middleView!]) //用参考视图边界作为碰撞边界 collisionBehavior.translatesReferenceBoundsIntoBoundary = true collisionBehavior.collisionDelegate = self //物体属性行为包括弹性、摩擦力、密度、阻力等等 let litterBehavior = UIDynamicItemBehavior(items: [litterView!]) litterBehavior.elasticity = 0.6 //密度 litterBehavior.density = 2.2 let hugeBehavior = UIDynamicItemBehavior(items: [hugeView!]) //弹性 hugeBehavior.elasticity = 0.8 //阻力 hugeBehavior.resistance = 0.3 hugeBehavior.density = 12.2 dynamicAnimator.addBehavior(gravite) dynamicAnimator.addBehavior(collisionBehavior) dynamicAnimator.addBehavior(litterBehavior) dynamicAnimator.addBehavior(hugeBehavior) } override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { let touch = touches.first let point = touch?.locationInView(self.view) //删除原有的吸附 if snapBheavior != nil { dynamicAnimator.removeBehavior(snapBheavior!) } //添加新吸附 snapBheavior = UISnapBehavior(item: middleView!, snapToPoint: point!) //阻尼 snapBheavior?.damping = 0.2 dynamicAnimator.addBehavior(snapBheavior!) } func createGlobe(frame:CGRect,color:UIColor) -> UIView{ let view = UIView (frame: frame) view.backgroundColor = color view.layer.borderColor = UIColor.greenColor().CGColor view.layer.cornerRadius = frame.size.width/2 view.layer.masksToBounds = true view.layer.borderWidth = 2 return view } func collisionBehavior(behavior: UICollisionBehavior, endedContactForItem item1: UIDynamicItem, withItem item2: UIDynamicItem) { let color = hugeView!.backgroundColor hugeView!.backgroundColor = litterView!.backgroundColor litterView!.backgroundColor = color } func collisionBehavior(behavior: UICollisionBehavior, endedContactForItem item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?) { } func collisionBehavior(behavior: UICollisionBehavior, beganContactForItem item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, atPoint p: CGPoint) { } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }