• 05-UIDynamic


    //
    //  ViewController.m
    //  06-UIDynamic
    
    
    #import "ViewController.h"
    
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIView *blueView;
    /** 物理仿真器 */
    @property (nonatomic, strong) UIDynamicAnimator *animator;
    @property (weak, nonatomic) IBOutlet UISegmentedControl *segmentControl;
    @end
    
    @implementation ViewController
    
    - (UIDynamicAnimator *)animator
    {
        if (!_animator) {
            // 创建物理仿真器(ReferenceView, 参照视图, 其实就是设置仿真范围)
            _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
        }
        return _animator;
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        self.blueView.transform = CGAffineTransformMakeRotation(M_PI_4);
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        // 获得触摸点
        UITouch *touch = [touches anyObject];
        CGPoint point = [touch locationInView:self.view];
        
        // 创建吸附捕捉行为
        UISnapBehavior *snap = [[UISnapBehavior alloc] initWithItem:self.blueView snapToPoint:point];
        // 防抖系数(值越小, 越抖)
        snap.damping = 1.0;
        
        // 添加行为
        [self.animator removeAllBehaviors];
        [self.animator addBehavior:snap];
    }
    
    - (void)testCollision2
    {
        // 1.创建 碰撞行为
        UICollisionBehavior *collision = [[UICollisionBehavior alloc] init];
        [collision addItem:self.blueView];
        //    [collision addItem:self.segmentControl];
        
        // 添加边界
        //    CGFloat startX = 0;
        //    CGFloat startY = self.view.frame.size.height * 0.5;
        //    CGFloat endX = self.view.frame.size.width;
        //    CGFloat endY = self.view.frame.size.height;
        //    [collision addBoundaryWithIdentifier:@"line1" fromPoint:CGPointMake(startX, startY) toPoint:CGPointMake(endX, endY)];
        //    [collision addBoundaryWithIdentifier:@"line2" fromPoint:CGPointMake(endX, 0) toPoint:CGPointMake(endX, endY)];
        
        CGFloat width = self.view.frame.size.width;
        UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, width, width)];
        [collision addBoundaryWithIdentifier:@"circle" forPath:path];
        
        // 2.创建物理仿真行为 - 重力行为
        UIGravityBehavior *gravity = [[UIGravityBehavior alloc] init];
        gravity.magnitude = 10;
        [gravity addItem:self.blueView];
        
        // 3.添加行为
        [self.animator addBehavior:collision];
        [self.animator addBehavior:gravity];
    }
    
    - (void)testCollision
    {
        // 1.创建 碰撞行为
        UICollisionBehavior *collision = [[UICollisionBehavior alloc] init];
        // 让参照视图的bounds变为碰撞检测的边框
        collision.translatesReferenceBoundsIntoBoundary = YES;
        [collision addItem:self.blueView];
        [collision addItem:self.segmentControl];
        
        // 2.创建物理仿真行为 - 重力行为
        UIGravityBehavior *gravity = [[UIGravityBehavior alloc] init];
        gravity.magnitude = 100;
        [gravity addItem:self.blueView];
        
        // 3.添加行为
        [self.animator addBehavior:collision];
        [self.animator addBehavior:gravity];
    }
    
    - (void)testGravity
    {
        // 1.创建物理仿真行为 - 重力行为
        UIGravityBehavior *gravity = [[UIGravityBehavior alloc] init];
        [gravity addItem:self.blueView];
        // 重力方向
        //    gravity.gravityDirection = CGVectorMake(100, 100);
        // 重力加速度()
        gravity.magnitude = 10;
        // 100 point/s²
        // 移动的距离 = 1/2 * magnitude * 时间²
        
        // 2.添加 物理仿真行为 到 物理仿真器 中, 开始物理仿真
        [self.animator addBehavior:gravity];
    }
    @end
  • 相关阅读:
    echarts数据包坐标拾取工具
    JS 多个条件判断
    js 实现各浏览器全屏
    前端统计使用插件
    JS 随机排序算法
    js中布尔值为false的六种情况
    Mosaic
    单点登录
    JavaScript数据结构和算法
    一个普通函数的冷僻属性(length、caller、arguments、name、[[Scopes]]和[[FunctionLocation]])
  • 原文地址:https://www.cnblogs.com/laugh/p/6962665.html
Copyright © 2020-2023  润新知