iOS动力学UIDynamic讲解(二)

原创 2015年07月08日 23:12:55

       之前我们接触了UIDynamic中的重力行为和碰撞行为,都比较好理解。今天我们来看另外两个行为:吸附行为(捕捉行为)UISnapBehavior 附着行为UIAttachmentBehavior

       从一个简单的Demo开始

       先看看效果图

这个项目展示的是两个视图View通过一根线连接起来的运动模拟,正方形物体可以随意摆动和旋转,触摸屏幕可带动两个物体一起运动,这是个很好的将吸附行为附着行为结合的例子

下面来看具体代码:

@implementation ViewController
{
    
    UIDynamicAnimator     *_animator;    //物理仿真器
    UIGravityBehavior     *_gravity;     //重力行为
    UICollisionBehavior   *_collision;   //碰撞行为
    UISnapBehavior        *_snap;        //吸附(捕捉)行为
    UIAttachmentBehavior  *_attach;      //附着行为
    
    UIView              *_view1;
    UIView              *_view2;
    
    BackView            *_backView;    //用来作为仿真器视图容器范围
    CADisplayLink       *_link;
}


- (void)viewDidLoad
{
    
    [super viewDidLoad];
    
    
    _backView = [[BackView alloc] initWithFrame:self.view.bounds];
    _view1 = [[UIView alloc] initWithFrame:CGRectMake(100, 50, 50, 50)];
    _view2 = [[UIView alloc] initWithFrame:CGRectMake(100, 150, 50, 50)];
    
    
    _backView.backgroundColor = [UIColor whiteColor];
    _view1.backgroundColor = [UIColor blueColor];
    _view1.layer.cornerRadius = 25.0;
    _view2.backgroundColor = [[UIColor greenColor] colorWithAlphaComponent:0.5];


    [self.view addSubview:_backView];
    [_backView addSubview:_view1];
    [_backView addSubview:_view2];

    

    //初始化仿真器
    _animator = [[UIDynamicAnimator alloc] initWithReferenceView:_backView];
    
    //添加重力行为
    _gravity = [[UIGravityBehavior alloc] initWithItems:nil];
    [_gravity addItem:_view2];
    
    // 添加碰撞行为
    _collision = [[UICollisionBehavior alloc] initWithItems:nil];
    _collision.translatesReferenceBoundsIntoBoundary = YES;
    [_collision addItem:_view1];
    [_collision addItem:_view2];

    //添加吸附行为(捕捉行为),意思是让物体吸附到某一点上
    _snap = [[UISnapBehavior alloc] initWithItem:_view1 snapToPoint:CGPointMake(125, 125)];
    _snap.damping = 1.0;

    //添加附着行为,让_view2视图附着在_view1周围(两物体附着的距离取决于它们的初始位置的距离)
    _attach = [[UIAttachmentBehavior alloc] initWithItem:_view1 attachedToItem:_view2];
    _attach.damping = 0.1;    //弹力
    _attach.frequency = 1.0;  //频率
    
    
    [_animator addBehavior:_gravity];
    [_animator addBehavior:_collision];
    [_animator addBehavior:_snap];
    [_animator addBehavior:_attach];
    
    //添加runloop便于绘制直线
    _link = [CADisplayLink displayLinkWithTarget:self selector:@selector(update)];
    [_link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
    
}


//此方法会在程序绘制每帧时调用一次,再调用backView的drawRect方法绘制线条

-(void)update
{
    _backView.point1 = _view1.center;
    _backView.point2 = _view2.center;
    [_backView setNeedsDisplay];
}


//屏幕触摸事件,利用吸附行为让圆形物体跟随用户手指移动

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    
    CGPoint pt = [[touches anyObject] locationInView:self.view];
  

   //要先移除原来的吸附行为, 不然物体无法运动

    [_animator removeBehavior:_snap];
    _snap = [[UISnapBehavior alloc] initWithItem:_view1 snapToPoint:pt];
    _snap.damping = 1.0;
    [_animator addBehavior:_snap];

}


-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    
    CGPoint pt = [[touches anyObject] locationInView:self.view];
    [_animator removeBehavior:_snap];
    _snap = [[UISnapBehavior alloc] initWithItem:_view1 snapToPoint:pt];
    _snap.damping = 1.0;
    [_animator addBehavior:_snap];
    
}


_backView内代码:

@property(nonatomic, assign) CGPoint point1;
@property(nonatomic, assign) CGPoint point2;

-(void)drawRect:(CGRect)rect
{
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextSetStrokeColorWithColor(context, [UIColor purpleColor].CGColor);
    CGContextSetLineWidth(context, 4.0);
    
    CGContextMoveToPoint(context, _point1.x, _point1.y);
    CGContextAddLineToPoint(context, _point2.x, _point2.y);
    
    CGContextStrokePath(context);
 
}







版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

iOS动力学UIDynamic讲解(一)

UIDynamic是苹果在iOS7之后添加的一套动力学框架,简单来说就是类似与Box2d之类的物理引擎,运用它我们可以极其方便地模拟现实生活中的运动,比如重力,碰撞等等。它是通过添加行为的方式让动力学...
  • gmfxch
  • gmfxch
  • 2015年07月04日 22:11
  • 879

UIDynamic—UIKit 动力学

UIDynamic—UIKit 动力学(多数情况还是CA或UIView为主) 其他仿真2D物理引擎:BOX2D:C语言框架,免费   Chipmunk:C语言框架免费   UIKit动力学 最大特点...

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

一、重力行为 说明:给定重力方向、加速度,让物体朝着重力方向掉落 1.方法 (1)UIGravityBehavior的初始化   - (instancetype)initWithItems:(...

iOS 开发之UIDynamic

(一)、UIDynamic的概念              UIDynamic是从iOS7开始引入的一种新的技术,隶属于UIKit框架。我们可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象如重...

iOS-UIDynamic物理仿真-附着-UIAttachmentBehavior

附着-UIAttachmentBehavior 物理仿真中的附着行为的实现同之前’捕捉’步骤 1.创建物理仿真器对象 2.创建物理仿真行为对象 3.设置物理仿真行为的属性 4.将仿真行为...

iOS开发之 UIDynamic (动力效果)

一、UIDynamic入门须知 UIDynamic 是从iOS7 开始引入的一种新技术,属于UIKit框架,可以模拟现实生活中的物理现象,如碰撞、抖动、摆动等    1⃣️、动...

【iOS开发系列】物理仿真动画UIDynamic (1)

iOS开发拓展篇—UIDynamic(简单介绍) 【一】简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引...

iOS-UIDynamic物理仿真-重力、碰撞

UIDynamicUIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象如:重力、弹性碰撞等现象任何遵守了UIDynamic...

iOS UIDynamic动画

UIDynamic 是iOS 7出现的一个新的特性,通过利用UIDynamic,我们可以在远离物理公式的计算下,通过简单的参数设置,能够实现一些复杂的动画效果。比如下面这样的。 如果需要自己动手写...
  • a158337
  • a158337
  • 2016年01月13日 11:57
  • 270

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

一、简介 可以让物体迅速冲到某个位置(捕捉位置),捕捉到位置之后会带有一定的震动 UISnapBehavior的初始化   - (instancetype)initWithItem:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS动力学UIDynamic讲解(二)
举报原因:
原因补充:

(最多只允许输入30个字)