UIFieldBehavior.h
2019-06-25 本文已影响0人
zhYx_
#if USE_UIKIT_PUBLIC_HEADERS || !__has_include(<UIKitCore/UIFieldBehavior.h>)
//
// UIFieldBehavior.h
// UIKit
//
// Copyright (c) 2015-2018 Apple Inc. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIDynamicBehavior.h>
NS_ASSUME_NONNULL_BEGIN
@class UIRegion;
#pragma mark - 行为力场 Class
#pragma mark -
/*
概述
- 定义了诸如重力/磁力/阻力/速度/湍流等物理力场
*/
NS_CLASS_AVAILABLE_IOS(9_0) @interface UIFieldBehavior : UIDynamicBehavior
#pragma mark |实例化|
- (instancetype)init NS_UNAVAILABLE;
// 添加要关联的Item
- (void)addItem:(id <UIDynamicItem>)item;
// 移除要关联的Item
- (void)removeItem:(id <UIDynamicItem>)item;
/// 获取所有关联的Item
@property (nonatomic, readonly, copy) NSArray<id <UIDynamicItem>> *items;
/// 引力点位置
@property (nonatomic, assign) CGPoint position;
/// 力场外形(以position为中心点的形状,只有在此区域内的Item才会被力场作用;默认:infiniteRegion)
@property (nonatomic, strong) UIRegion *region;
/// 力场强度(默认:1.0)
@property (nonatomic, assign) CGFloat strength;
/// 力场强度衰减率(中心点到最远点力的衰减强度;默认:0)
@property (nonatomic, assign) CGFloat falloff;
/// 最小效果半径(当对象靠近力场的中心时,使用此属性可以修改基于距离的效果的行为,小于最小值的距离被视为等于最小值;此外,在达到最小距离之前不会有衰减之类的效果;默认:非常小,但不是0)
@property (nonatomic, assign) CGFloat minimumRadius;
/// 引力线位置(使用此属性指定速度和线性重力场的运动方向)
@property (nonatomic, assign) CGVector direction;
/// 力场的流量(对于噪音力场和湍流力场,此值指定噪音或湍流量;0.0表示最大噪声或湍流,1.0表示最小的噪声或湍流量)
@property (nonatomic, assign) CGFloat smoothness;
/// 力场的动画速率(对于噪声和湍流场,此属性有效;1.0表示力场动画以正常速度进行)
@property (nonatomic, assign) CGFloat animationSpeed;
/**
牵引力场
@return UIFieldBehavior
- 模拟物体上的摩擦力,如空气中运动的摩擦等效果
- 力施加在受影响物体的速度矢量的相反方向上
- 力的大小与力场强度和物体的当前速度成比例
*/
+ (instancetype)dragField;
/**
旋涡力场
@return UIFieldBehavior
- 可用于创建旋转效果
- 设置涡旋力场的强度时,正值会产生逆时针旋转,负值会产生顺时针旋转
- 旋转力度与物体的质量和物体与力场原点的距离成正比
*/
+ (instancetype)vortexField;
/**
引力力场(一个点具有引力,类似万有引力)
@param position 引力点位置(可以通过修改position属性来更改此值)
@return UIFieldBehavior
- 在坐标系中的指定点处创建重力,具有质量的动态项将被吸引到重力点
- 正值会将物体吸引到重力点的位置,负值会排斥物体
- 力等于物体的质量乘以重力场施加的加速度,重力场由力场的强度和物体与力场原点的距离决定
*/
+ (instancetype)radialGravityFieldWithPosition:(CGPoint)position;
/**
引力力场(线性引力,一条线上都具有相同力的引力)
@param direction 引力线位置(可以通过修改direction属性来更改此值)
@return UIFieldBehavior
- 在坐标系中的指定线段处创建重力,具有质量的动态项将被吸引到重力点
- 正值会将物体吸引到引力线的位置,负值会排斥物体
- 力等于物体的质量乘以重力场所施加的加速度,这种类型的力场是恒定的
*/
+ (instancetype)linearGravityFieldWithVector:(CGVector)direction;
/**
矢量速度力场
@param direction 将应用于身体的定向速度
@return UIFieldBehavior
- 进入力场作用区域的任何物体,都会受到此矢量速度的影响
- 此力场会覆盖应用于物体本身的任何其他加速度效果
- direction参数中的矢量与力场强度组合来确定力场中物体的速度
*/
+ (instancetype)velocityFieldWithVector:(CGVector)direction;
/**
噪音力场
@param smoothness 平滑度(0表示尽可能随机,1表示尽可能平滑)
@param speed 以Hz为单位的一般字段变化率
@return UIFieldBehavior
- 将噪音力场与其他力组合,可以为这力的行为添加一些可变性
- 噪音力场会随着时间的推移而衰减
- 该力场忽略物体的质量
*/
+ (instancetype)noiseFieldWithSmoothness:(CGFloat)smoothness animationSpeed:(CGFloat)speed;
/**
湍流力场
@param smoothness 平滑度(0表示尽可能随机,1表示尽可能平滑)
@param speed 以Hz为单位的一般字段变化率
@return UIFieldBehavior
- 类似噪音力场,该对象将噪音应用于运动中的物体
- 该力场产生的噪音强度与力场中物体的速度成正比
*/
+ (instancetype)turbulenceFieldWithSmoothness:(CGFloat)smoothness animationSpeed:(CGFloat)speed;
/**
弹簧力场
@return UIFieldBehavior
- 使用胡克定律来计算应用于物体的弹簧力(力的大小与距离力场中心的距离成线性比例;进入该区域的物体以与其密度的倒数成反比的周期振荡)
- 可以使用此力场将物体限制在特定区域
- 作用在物体上的阻力会随时间增长,降低其线性速度以及振荡量
- 弹簧力场中的物体会连续振荡,除非弹簧力受到摩擦阻尼或物体受到其他区域的影响
*/
+ (instancetype)springField;
/**
电流力场
@return UIFieldBehavior
- 电流力场力的大小与物体的电荷成比例(力等于物体的电荷乘以物体在该力场中的当前位置处的电场强度)
- 相反的电荷相互吸引,相似的电荷相互排斥(具有正电荷值的物体被具有负电荷值的物体吸引并另一个正电荷值的物体排斥)
*/
+ (instancetype)electricField;
/**
磁性力场
@return UIFieldBehavior
- 可以把磁性力场与电流力场的物体结合使用
- 磁性力场是正Z轴方向上的均匀力场(从屏幕出来)
*/
+ (instancetype)magneticField;
/**
综合力场
@param block 综合配置回调
@return UIFieldBehavior
- 动画过程中会多次调用Block中的设置
*/
+ (instancetype)fieldWithEvaluationBlock:(CGVector(^)(UIFieldBehavior *field, CGPoint position, CGVector velocity, CGFloat mass, CGFloat charge, NSTimeInterval deltaTime))block;
@end
NS_ASSUME_NONNULL_END
#else
#import <UIKitCore/UIFieldBehavior.h>
#endif