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重力、弹性碰撞吸附等现象

猫猫分享,必须精品原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243一:效果重力和碰撞 吸附现象 二:简介什么是UIDynamic...
  • u013357243
  • u013357243
  • 2015年08月25日 08:12
  • 4945

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

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

机器人动力学建模实例:二连杆机械臂

机器人动力学方程比较复杂,通常每一个参数矩阵都非常庞大,这里介绍几个简单结构的动力学方程,对于一般的控制算法,可以在这几个动力学方程中进行验证。...
  • xuehuafeiwu123
  • xuehuafeiwu123
  • 2016年10月08日 15:17
  • 4925

iOS动力学UIDynamic讲解(一)

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

UIDynamic—UIKit 动力学

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

iOS 之物理仿真引擎-UIDynamic简介(二)

一、重力行为 说明:给定重力方向、加速度,让物体朝着重力方向掉落 1.方法 (1)UIGravityBehavior的初始化   - (instancetype)initWithItems:(...
  • codeblshi
  • codeblshi
  • 2014年12月26日 23:26
  • 537

iOS开发之 UIDynamic (动力效果)

一、UIDynamic入门须知 UIDynamic 是从iOS7 开始引入的一种新技术,属于UIKit框架,可以模拟现实生活中的物理现象,如碰撞、抖动、摆动等    1⃣️、动...
  • ltj1171528192
  • ltj1171528192
  • 2015年10月01日 14:29
  • 679

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

一、简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如:重力、弹性...
  • a454431208
  • a454431208
  • 2015年10月22日 19:32
  • 216

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

一、重力行为 说明:给定重力方向、加速度,让物体朝着重力方向掉落 1.方法 (1)UIGravityBehavior的初始化   - (instancetype)initWithItems:(...
  • a454431208
  • a454431208
  • 2015年10月22日 19:33
  • 159

iOS 开发之UIDynamic

(一)、UIDynamic的概念              UIDynamic是从iOS7开始引入的一种新的技术,隶属于UIKit框架。我们可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象如重...
  • lvchenqiang_
  • lvchenqiang_
  • 2015年11月03日 21:56
  • 189
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS动力学UIDynamic讲解(二)
举报原因:
原因补充:

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