最近搞了一下物理仿真行为,demo效果如下图,一共分为3部分
一、拖拽上面的灰色view产生新的view
二、下面的view之间的相互碰撞
三、双击时以小方块的形式向外面散去
首先先说一下我的实现思路:
一、给上面的黑色view添加拖拽手势,并在拖拽手势的方法里添加UISnapBehavior捕捉行为,在拖动的过程中不断改变捕捉点即snapPoint。核心代码如下
func pan(pan:UIPanGestureRecognizer){
if(pan.state@H_403_15@ == UIGestureRecognizerState.Ended@H_403_15@ || pan.state@H_403_15@ == UIGestureRecognizerState.Cancelled@H_403_15@){
self.animator@H_403_15@.removeBehavior@H_403_15@(snap)
self.snap@H_403_15@ = nil
}else{
if let _ = snap{
self.animator@H_403_15@.removeBehavior@H_403_15@(snap)
}
self.snap@H_403_15@ = UISnapBehavior(item: self,snapToPoint: pan.locationInView@H_403_15@(self.superview@H_403_15@))
self.snap@H_403_15@.damping@H_403_15@ = 0.25@H_403_15@
self.animator@H_403_15@.addBehavior@H_403_15@(self.snap@H_403_15@)
}
}
二:双击时向四周分散的销毁的过程,首先把view分成好多个小view,然后给每个小view添加UIPushBehavior推动行为,代码如下
//分割view
func sliceView(tempView:UIView) -> NSArray{
let array = NSMutableArray()
//首先通过View得到一个UIImage
UIGraphicsBeginImageContext(tempView.bounds@H_403_15@.size@H_403_15@)
tempView.drawViewHierarchyInRect@H_403_15@(tempView.bounds@H_403_15@,afterScreenUpdates: false)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
let row = 6@H_403_15@
let column = 6@H_403_15@
let width = tempView.bounds@H_403_15@.size@H_403_15@.width@H_403_15@ / (CGFloat)(row)
let height = tempView.bounds@H_403_15@.size@H_403_15@.height@H_403_15@ / (CGFloat)(column)
for i in@H_403_15@ 1.@H_403_15@..row@H_403_15@ {
for j in@H_403_15@ 1.@H_403_15@..column@H_403_15@{
let rect = CGRectMake((CGFloat)(i - 1@H_403_15@) * width,(CGFloat)(j - 1@H_403_15@) * height,width,height)
//把UIImage分割成好多小UIImage
let smallImage = CGImageCreateWithImageInRect(image.CGImage@H_403_15@,rect)
let imageView = UIImageView(image: UIImage(CGImage: smallImage!))
let rect1 = CGRectOffset(rect,CGRectGetMinX(tempView.frame@H_403_15@),CGRectGetMinY(tempView.frame@H_403_15@))
imageView.backgroundColor@H_403_15@ = UIColor.yellowColor@H_403_15@()
imageView.frame@H_403_15@ = rect1
array.addObject@H_403_15@(imageView)
}
}
return array
}
三:下面可以相互碰撞的view,给他们添加了重力,碰撞和捕捉行为,并且他们都有Pan手势,在移动的过程中改变捕捉点,代码就不贴了
感兴趣的同学可以参考demo