swift4.2 - UIDynamic

Posted qingzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift4.2 - UIDynamic相关的知识,希望对你有一定的参考价值。

 

1. SB放上俩 imageview,拖线成类属性

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var box2: UIImageView!
    @IBOutlet weak var box1: UIImageView!
    
    //1.s创建仿真器
       private lazy var animator: UIDynamicAnimator = UIDynamicAnimator(referenceView: self.view)
    override func viewDidLoad() {
        super.viewDidLoad()
        //设置背景颜色图
        view.backgroundColor = UIColor(patternImage: UIImage.init(named: "background") ?? UIImage())
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        
        let point = touches.first?.location(in: view)
        snap(point: point ?? CGPoint.zero)
        
        gravity()
        collision()
        push()
    }
    
    ///重力
    func gravity() {
        
        //2.创建仿真行为
        let behavior = UIGravityBehavior(items: [box1])
        
        //重力方向,重力的力度
//        behavior.gravityDirection = CGVector(dx: 10, dy: -10)
        
//        //角度
//        behavior.angle =  -CGFloat.pi
//
//        //量级:速度
//        behavior.magnitude = 5
        
        //设置角度和量级
        behavior.setAngle( CGFloat.pi/2, magnitude: 5)
        
        //3. 仿真器添加仿真行为
        animator.addBehavior(behavior)
    }
    
    
    /// 碰撞
    func collision() {
        
        //2.创建仿真行为
        let behavior = UICollisionBehavior(items: [box1, box2])
        
        //添加碰撞边界: view的bounds
        behavior.translatesReferenceBoundsIntoBoundary = true

//        items: 只碰撞元素
//        boundaries:只碰撞边界
//        everything:任何东西
        //碰撞模式
        behavior.collisionMode = UICollisionBehavior.Mode.everything
        
        //设置边界的内边距
//        behavior.setTranslatesReferenceBoundsIntoBoundary(with: UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20))
        
        let str :  NSString = "123" // NSString 遵循NSCopying
        let str1 : String = "123"   //String 没有遵循NSCopying
        //添加一个边界
//        behavior.addBoundary(withIdentifier: str, from: CGPoint(x: 0, y: 500), to: CGPoint(x: view.frame.size.width, y: 300))
        
        
        //设置代理
        behavior.collisionDelegate = self
        //3. 仿真器添加仿真行为
        animator.addBehavior(behavior)
    }
    

    /// 创建捕捉行为
    func snap(point:CGPoint){
        //FIXME:如果想要多次执行p捕捉行为,必须先移除添加捕捉行为
        animator.removeAllBehaviors()
        
        let behavior = UISnapBehavior(item: box2, snapTo: point)
        
        //动画流畅度
        behavior.damping = 1
        
        animator.addBehavior(behavior)
    }

    func push(){
        
        // continuous:一直推
        // instantaneous:推一次
        //1.创建推行为
        let behavior = UIPushBehavior(items: [box1], mode: UIPushBehavior.Mode.instantaneous)
        
        //设置方向
        behavior.pushDirection = CGVector(dx: 0, dy: -8)
        
        //2. 仿真器添加仿真行为
        animator.addBehavior(behavior)
    }
    
}


extension ViewController:UICollisionBehaviorDelegate{
    func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item1: UIDynamicItem, with item2: UIDynamicItem, at p: CGPoint){
        print("开始碰撞 元素 - 元素", p)
    }
    
    func collisionBehavior(_ behavior: UICollisionBehavior, endedContactFor item1: UIDynamicItem, with item2: UIDynamicItem){
        print("结束碰撞 元素 - 元素")
    }
    
    func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, at p: CGPoint){
        print("开始碰撞 元素 - 边界", p)
    }
    
    func collisionBehavior(_ behavior: UICollisionBehavior, endedContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?){
        print("结束碰撞 元素 - 边界")
    }
}

  

以上是关于swift4.2 - UIDynamic的主要内容,如果未能解决你的问题,请参考以下文章

UIDynamic

UIDynamic仿物理引擎-浮动碰撞效果-b

UIDynamic(物理仿真)

iOS开发拓展篇—UIDynamic(捕捉行为)

iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)

iOS开发拓展篇—UIDynamic(简单介绍)