IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> IOS开发之UI进阶(UIDynamic物理引擎) -> 正文阅读

[移动开发]IOS开发之UI进阶(UIDynamic物理引擎)

UIDynamic

UIKit动力学最大的特点是将现实世界动力驱动的动画引入了UIKit,比如重力,铰链连接,碰撞,悬挂等效果,即将2D物理引擎引入了UIKit

  • 注意:UIKit动力学的引入,并不是为了替代CA或者UIView动画,在绝大多数情况下CA或者UIView动画仍然是最优方案,只有在需要引入逼真的交互设计的时候,才需要使用UIKit动力学它是作为现有交互设计和实现的一种补充
  • 其他2D仿真引擎:BOX2DC语言框架免费;ChipmunkC语言框架免费,其他版本收费

UIDynamic三个重要的概念

  • DynamicAnimator:动画者,为动力学元素提供物理学相关的能力及动画,同时为这些元素提供相关的上下文,是动力学元素与底层os物理引擎之间的中介,将Behavior对象添加到 Animator即可实现动力仿真

  • DynamicAnimatorItem:动力学元素,是任何遵守了 UIDynamicItem协议的对象,从IOS7.0开始,UIViewUICollectionViewLayoutAttributes默认实现该协议。如果自定义的对象实现了该协议,即可通过DynamicAnimator实现物理仿真

  • UIDynamicBehavior:仿真行为,是动力学行为的父类,基本的动力学行为类
    UIGravityBehavior:重力行为
    UICollisionBehavior: 碰撞行为
    UlAttachmentBehavior:吸附行为
    UISnapBehavior:甩行为
    UIPushBehavior:推动行为
    UIDynamicItemBehavior:动力学元素自身属性

重力

    //1.根据一个范围创造动画者对象
    UIDynamicAnimator *animator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
    //2.根据某一个动力学元素,创建行为
    //重力
    UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[self.redView]];
    //3.把行为添加到动画者中
    [animator addBehavior:gravity];
    设置角度
    gravity.angle = M_PI;
    
    设置方向 按照x,y轴
    gravity.gravityDirection = CGVectorMake(1, 1);
    
    重力的量级
    gravity.magnitude = 10;

碰撞

    //1.根据一个范围创造动画者对象
    UIDynamicAnimator *animator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
    //2.根据某一个动力学元素,创建行为
    //重力
    UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[self.redView]];
    //碰撞
    UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[self.redView]];
    //把引用view的bounds变成边界
    collision.translatesReferenceBoundsIntoBoundary = YES;
    //3.把行为添加到动画者中 
    [animator addBehavior:gravity];
    [animator addBehavior:collision];
	碰撞模式选择
typedef NS_OPTIONS(NSUInteger, UICollisionBehaviorMode) {
    UICollisionBehaviorModeItems        = 1 << 0,
    UICollisionBehaviorModeBoundaries   = 1 << 1,
    UICollisionBehaviorModeEverything   = NSUIntegerMax
} API_AVAILABLE(ios(7.0));

    碰撞模式,默认是UICollisionBehaviorModeEverything
    collision.collisionMode = UICollisionBehaviorModeEverything;
    
    添加边界
    [collision addBoundaryWithIdentifier:@"key" fromPoint:CGPointMake(0, 200) toPoint:CGPointMake(200, 250)];

	为view添加固定的边界
    UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.blueView.frame];
    [collision addBoundaryWithIdentifier:@"key" forPath:path];
    
    实时监听函数
    // __weak ViewController  *weakSelf = self;出现循环引用的情况,可以使用这个避免
    collision.action = ^{
        //实时监听
    };
  • 代理
@protocol UICollisionBehaviorDelegate <NSObject>
@optional
//view碰撞开始与结束
- (void)collisionBehavior:(UICollisionBehavior *)behavior beganContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2 atPoint:(CGPoint)p;
- (void)collisionBehavior:(UICollisionBehavior *)behavior endedContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2;
//边界碰撞开始和结束
- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(nullable id <NSCopying>)identifier atPoint:(CGPoint)p;
- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(nullable id <NSCopying>)identifier;
@end
	collision.collisiondelegate = self;	
	//代理方法边界碰撞开始
- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(nullable id <NSCopying>)identifier atPoint:(CGPoint)p{
	NSString *str = (NSString *)identifier;//需要强转一下
	if([str isEquelToString:@"key"]){//如果撞击的是key
		self.redView.backgroundColor = [UIColor redColor];
	}
}

甩行为

    //1.根据一个范围创造动画者对象
    UIDynamicAnimator *animator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
    //2.根据某一个动力学元素,创建行为
    //获取触碰点,甩到目的点
    UITouch *touch = touches.anyObject;
    CGPoint p = [touch locationInView:touch.view];
    //行为
    UISnapBehavior *snap = [[UISnapBehavior alloc] initWithItem:self.redView snapToPoint:p];
    //3.把行为添加到动画者中
    [animator addBehavior:snap];
	减速程度
	snap.damping = 0;//0-1 越小震动越大

吸附行为

    //获取触碰点,甩到目的点
    UITouch *touch = touches.anyObject;
    CGPoint p = [touch locationInView:touch.view];

    //1.根据一个范围创造动画者对象
    UIDynamicAnimator *animator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
    //2.根据某一个动力学元素,创建行为
    UIAttachmentBehavior *attach = [[UIAttachmentBehavior alloc]initWithItem:self.redView attachedToAnchor:p];
    //3.把行为添加到动画者中
    [animator addBehavior:attach];
	需要写在touchMove里面,附着点
	attach.anchorPoint = p;
	
	吸附杠长度
	attach.length = 100;

	设置弹性吸附
	attach.damping = 0.5;//减速幅度
	attach.frequency = 10;//赫兹

推行为

    //1.根据一个范围创造动画者对象
    UIDynamicAnimator *animator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
    //2.根据某一个动力学元素,创建行为
    UIPushBehavior *push = [[UIPushBehavior alloc]initWithItems:@[self.redView] mode:UIPushBehaviorModeContinuous];
    //量级
    push.magnitude = 1;
    //方向 角度
    push.angle = M_PI;
    //方向 x,y轴
    push.pushDirection = CGVectorMake(100, 100);
    //3.把行为添加到动画者中
    [animator addBehavior:push];

动力学元素自身属性

@property (readwrite, nonatomic) CGFloat elasticity; // 弹力 0-1
@property (readwrite, nonatomic) CGFloat friction;   // 摩擦力 0表示对象之间没有摩擦,因此会沿彼此滑动
@property (readwrite, nonatomic) CGFloat density;    // 密度 默认1 
@property (readwrite, nonatomic) CGFloat resistance; // 阻力 0表示无速度阻尼
@property (readwrite, nonatomic) CGFloat angularResistance; //角度阻力 0表示无角速度阻尼
    //1.根据一个范围创造动画者对象
    UIDynamicAnimator *animator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
    //2.根据某一个动力学元素,创建行为
    UIPushBehavior *push = [[UIPushBehavior alloc]initWithItems:@[self.redView] mode:UIPushBehaviorModeContinuous];
    //动力学元素 自身属性
    UIDynamicItemBehavior *itemBehavior = [[UIDynamicItemBehavior alloc]initWithItems:@[self.redView]];
    itemBehavior.friction = 0.5;//摩擦力
    itemBehavior.elasticity = 1;//弹力
    
    [animator addBehavior:push];
    [animator addBehavior:itemBehavior];
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-17 12:52:17  更:2021-11-17 12:53:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:21:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码