iOS重力行为、碰撞行为和吸附(Swift)

来源:互联网 发布:网络发票管理系统下载 编辑:程序博客网 时间:2024/05/22 09:01
iOS有模仿物理环境的动态动画,今天就简单的给视图添加重力效果和碰撞效果

首先使用一个参考视图也可以理解为背景视图创建自动动画:

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 UIKitclass 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.    }}
0 0
原创粉丝点击