12.UIKit动力学

2021-12-01  本文已影响0人  LucXion

UIKit动力学三大要素

动力项附加到行为,行为附加到动画类。动力项不知道它的行为,如果一个视图添加了重力行为,接着将视图移除出父视图,则动力项会持续持有该视图,并对其进行动画,即使视图不可见。

内置行为

iOS 内置了可以处理大多数简单需求的有用的行为,包括迅速移动、附着、重力、碰撞、推力和动力项。

动力项

实战代码

行为合集:行为内包含多个内置行为

// 1. 继承关系 
@interface DefaultBehavior : UIDynamicBehavior
// 2. 将需要集合的行为附加到当前行为
  - (instancetype)init {
  self = [super init];
  if (self) {
      // 碰撞行为
    UICollisionBehavior *collisionBehavior = [UICollisionBehavior new];
    collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
    [self addChildBehavior:collisionBehavior];

      // 重力行为
    UIGravityBehavior *gravityBehavior = [UIGravityBehavior new];
    [self addChildBehavior:gravityBehavior];
  }
  return self;
}
// 3.封装两个对外函数,使动力项可以附加到行为上
- (void)addItem:(id<UIDynamicItem>)item {
  for (id behavior in self.childBehaviors) {
    [behavior addItem:item];
  }
}
- (void)removeItem:(id<UIDynamicItem>)item {
  for (id behavior in self.childBehaviors) {
    [behavior removeItem:item];
  }
}
  

自定义行为

// 移动视图  DraggableView
// 1. 保存控制器动画类 UIDynamicAnimator,添加拖拽手势
// 2. 实现 <NSCopying> ,传递动画类,同步bounds、center、transform、alpha
// 3. 响应手势函数:
//    3.1 拖拽过程中:动画类移除移动行为 UISnapBehavior,通过创建新的移动行为来实现位移 
//    3.2 拖拽结束:移除移动行为

// 自定义“分裂”行为  TearOffBehavior
// 1. 初始化
//    1.1 通过添加 快速移动行为 UISnapBehavior 实现视图可旋转
[self addChildBehavior:[[UISnapBehavior alloc] initWithItem:view
                                                    snapToPoint:anchor]];
//    1.2 实现 self.action 属性
          // 1.2.1 当视图发生偏移足够距离,通过复制当前视图,创建一个“分裂”出来的新视图,并将 新视图 附加到 新的分裂 行为上。
          // 1.2.2 注意: handler实际上只有一个,都是原始视图初始化的时候传递的
          // 1.2.3 行为和动画类的交替,移除动画类上前一个分裂行为,只保留新的
          // 1.2.4 给分裂出来的复制品添加碰撞和重力行为,并且添加个移除的特效(通过UIGraphicsBeginImageContext打开上下文将视图切片,通过拼接切片的方式维持原视图的视觉效果,通过施加推力行为+UIView动画使透明度渐变为0,并在动画结束后移除视图)
上一篇 下一篇

猜你喜欢

热点阅读