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
- iOS重力行为、碰撞行为和吸附(Swift)
- 【iOS开发-112】UIDynamic物理模拟介绍,如重力行为、碰撞行为、碰撞行为以及其他
- UIDynamic之重力行为+碰撞行为
- iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)
- iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)
- iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)
- iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)
- iOS学习之——仿真行为(重力、碰撞)
- iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)
- 猫猫学iOS 之UIDynamic重力、弹性碰撞吸附等现象
- OS开发拓展篇—UIDynamic(重力行为+碰撞检测)
- UIDynamic之重力行为
- (素材源码) 猫猫学iOS 之UIDynamic重力、弹性碰撞吸附等现象牛逼Demo
- (素材源码) 猫猫学iOS 之UIDynamic重力、弹性碰撞吸附等现象PS有惊喜
- AJ学IOS 之UIDynamic重力、弹性碰撞吸附等现象
- 碰撞行为矩阵
- 物理仿真UIDynamic 介绍 (吸附行为)(推动行为) (一)
- swift 物理仿真行为
- httpclient模拟登陆操作实现
- CSS常用操作
- struts文件下载
- 重入锁--ReentrantLock
- QuartZ Cron表达式
- iOS重力行为、碰撞行为和吸附(Swift)
- 热补丁方案和Instant-Run总结
- HTTP层面的Web Service自动化测试
- Android 热修复
- java编程思想--接口
- 自己封装用的Struts2BaseAction
- 修改dg备库错误路径名的数据文件
- 简单理解View的onMeasure过程
- 61. Rotate List