#if USE_UIKIT_PUBLIC_HEADERS || !__has_include(<UIKitCore/UIAttachmentBehavior.h>)
//
// UIAttachmentBehavior.h
// UIKit
//
// Copyright (c) 2012-2018 Apple Inc. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIDynamicBehavior.h>
NS_ASSUME_NONNULL_BEGIN
/* 附着行为类型 <枚举> */
typedef NS_ENUM(NSInteger, UIAttachmentBehaviorType) {
UIAttachmentBehaviorTypeItems,
UIAttachmentBehaviorTypeAnchor
} NS_ENUM_AVAILABLE_IOS(7_0);
/* 运动范围 <结构体> */
typedef struct {
CGFloat minimum;
CGFloat maximum;
} UIFloatRange;
UIKIT_EXTERN const UIFloatRange UIFloatRangeZero NS_AVAILABLE_IOS(9_0);
UIKIT_EXTERN const UIFloatRange UIFloatRangeInfinite NS_AVAILABLE_IOS(9_0);
UIKIT_EXTERN BOOL UIFloatRangeIsInfinite(UIFloatRange range) NS_AVAILABLE_IOS(9_0);
UIKIT_EXTERN BOOL UIFloatRangeIsEqualToRange(UIFloatRange range, UIFloatRange otherRange) NS_AVAILABLE_IOS(9_0);
UIKIT_STATIC_INLINE UIFloatRange UIFloatRangeMake(CGFloat minimum, CGFloat maximum) {
return (UIFloatRange){minimum, maximum};
}
#pragma mark - 吸附类
#pragma mark -
/*
- 概述
吸附主要发生在:元素与锚点;元素与元素之间
当元素与锚点连接,元素的运动依赖于锚点
当元素与元素连接,两个元素的运动彼此影响
有的吸附行为支持两个元素和一个锚点
除此之外,吸附还分为:刚性吸附和弹性吸附
刚性吸附就好像两个物体间使用固定的杆连接,运动时之间的距离不变
而弹性吸附就好像两个物体间使用橡皮筋连接,运动时两者之间的距离会发生弹性形变
*/
NS_CLASS_AVAILABLE_IOS(7_0) @interface UIAttachmentBehavior : UIDynamicBehavior
/* 实例化 */
// 元素和锚点之间的吸附
/*
元素和锚点之间像一个固定的杆进行连接,元素可以围绕锚点进行自由的旋转
元素和锚点之间的距离不变
*/
- (instancetype)initWithItem:(id <UIDynamicItem>)item attachedToAnchor:(CGPoint)point;
// 元素和锚点之间的吸附
/*
offset参数设置元素吸附力作用点的偏移量;其他同上边的方法
*/
- (instancetype)initWithItem:(id <UIDynamicItem>)item offsetFromCenter:(UIOffset)offset attachedToAnchor:(CGPoint)point NS_DESIGNATED_INITIALIZER;
// 元素和元素之间的吸附
/*
两个元素的中心是相互附着的(UIView的center其实就是View自身的锚点位置)
元素1和元素2之间就像有一个固定的杆连接着各自的锚点,一个作用力在一个元素上后会拖拽或者推着另一个元素,元素会自由的向四周进行旋转,但是元素1和元素2之间总是保持相同的距离
*/
- (instancetype)initWithItem:(id <UIDynamicItem>)item1 attachedToItem:(id <UIDynamicItem>)item2;
// 元素和元素之间的吸附
/*
offset1 是相对于元素1中心的偏移量
offset2 是相对于元素2中心的偏移量
*/
- (instancetype)initWithItem:(id <UIDynamicItem>)item1 offsetFromCenter:(UIOffset)offset1 attachedToItem:(id <UIDynamicItem>)item2 offsetFromCenter:(UIOffset)offset2 NS_DESIGNATED_INITIALIZER;
/*
item1和item2会吸附在锚点point上,而锚点point会按照axis向量指向的轴运动,从而得到一个attachment behavior对象
item1和item2不会相对于锚点和轴旋转
item1和item2运动的距离通过attachmentRange属性来限制
*/
+ (instancetype)slidingAttachmentWithItem:(id <UIDynamicItem>)item1 attachedToItem:(id <UIDynamicItem>)item2 attachmentAnchor:(CGPoint)point axisOfTranslation:(CGVector)axis NS_AVAILABLE_IOS(9_0);
/*
item会吸附在锚点point上,而锚点point会按照axis向量指向的轴运动,从而得到一个attachment behavior对象
item不会相对于锚点和轴旋转
item运动的距离通过attachmentRange属性来限制
*/
+ (instancetype)slidingAttachmentWithItem:(id <UIDynamicItem>)item attachmentAnchor:(CGPoint)point axisOfTranslation:(CGVector)axis NS_AVAILABLE_IOS(9_0);
/*
限制item1和item2之间的最大距离,从而得到一个attachment behavior对象
item1和item2之间就像用一条绳子拴住,它们在运动中之间最大距离为绳子的长度
offset1和offset2同上文中的作用力点偏移量
item1和item2之间的最大距离的初始值为item1和item2初始位置间的距离,后续可以通过length属性修改
*/
+ (instancetype)limitAttachmentWithItem:(id <UIDynamicItem>)item1 offsetFromCenter:(UIOffset)offset1 attachedToItem:(id <UIDynamicItem>)item2 offsetFromCenter:(UIOffset)offset2 NS_AVAILABLE_IOS(9_0);
/*
通过将item1和item2固定到锚点point上,得到一个attachment behavior对象
item1、item2和锚点point之间的相对位置在运动中是不会发生变化的,就好像三者之间被木棍固定成为一个单元
*/
+ (instancetype)fixedAttachmentWithItem:(id <UIDynamicItem>)item1 attachedToItem:(id <UIDynamicItem>)item2 attachmentAnchor:(CGPoint)point NS_AVAILABLE_IOS(9_0);
/*
通过将item1和item2固定到锚点point上,得到一个attachment behavior对象
item1和item2就像通过木棍固定到锚点point上,但是item1和item2可以围绕锚点以固定半径旋转,并且item1和item2之间不发生碰撞,item1和item2的旋转同时受frictionTorque旋转力矩属性和锚点运动影响
frictionTorque值改变必须在任何一个item旋转之前进行设置。当frictionTorque值为0时,item1和item2响应任何自由旋转脉冲
利用attachmentRange属性设置旋转的数量
*/
+ (instancetype)pinAttachmentWithItem:(id <UIDynamicItem>)item1 attachedToItem:(id <UIDynamicItem>)item2 attachmentAnchor:(CGPoint)point NS_AVAILABLE_IOS(9_0);
// 获取 所有的item
@property (nonatomic, readonly, copy) NSArray<id <UIDynamicItem>> *items;
// 获取 附着行为类型
@property (readonly, nonatomic) UIAttachmentBehaviorType attachedBehaviorType;
// 设置 锚点(默认:CGPointZero)
@property (readwrite, nonatomic) CGPoint anchorPoint;
// 设置 距离(两个附件point之间的距离)
@property (readwrite, nonatomic) CGFloat length;
// 设置 阻尼系数(产生弹跳的时候的衰减值;默认:1)
@property (readwrite, nonatomic) CGFloat damping;
// 设置 震荡频率
@property (readwrite, nonatomic) CGFloat frequency;
// 设置 需要克服围绕一个锚点进行旋转的力的大小(值越大阻力越大;默认:0.0)
@property (readwrite, nonatomic) CGFloat frictionTorque NS_AVAILABLE_IOS(9_0);
// 设置 运动范围(默认:UIFloatRangeInfinite)
@property (readwrite, nonatomic) UIFloatRange attachmentRange NS_AVAILABLE_IOS(9_0);
@end
NS_ASSUME_NONNULL_END
#else
#import <UIKitCore/UIAttachmentBehavior.h>
#endif
网友评论