jsdw_ios/QuickLocation/UIKit/Pop/DLViewTransition.h

274 lines
12 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// FWViewTransition.h
// DLSDK
//
// Created by osell on 2022/8/23.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
#pragma mark - DLAnimatedTransitionType
/**
转场动画类型
@const DLAnimatedTransitionTypeNone 转场未开始
@const DLAnimatedTransitionTypePush push转场
@const DLAnimatedTransitionTypePop pop转场
@const DLAnimatedTransitionTypePresent present转场
@const DLAnimatedTransitionTypeDismiss dismiss转场
*/
typedef NS_ENUM(NSInteger, DLAnimatedTransitionType) {
DLAnimatedTransitionTypeNone = 0,
FWAnimatedTransitionTypePush,
FWAnimatedTransitionTypePop,
FWAnimatedTransitionTypePresent,
FWAnimatedTransitionTypeDismiss,
} NS_SWIFT_NAME(AnimatedTransitionType);
#pragma mark - DLAnimatedTransition
/// 转场动画类,默认透明度变化
NS_SWIFT_NAME(AnimatedTransition)
@interface DLAnimatedTransition : UIPercentDrivenInteractiveTransition <UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegate, UINavigationControllerDelegate>
#pragma mark - Public
/// 创建系统转场单例,不支持交互手势转场
+ (instancetype)systemTransition;
/// 创建动画句柄转场
+ (instancetype)transitionWithBlock:(nullable void (^)(DLAnimatedTransition *transition))block;
/// 设置动画句柄
@property (nullable, nonatomic, copy) void (^transitionBlock)(DLAnimatedTransition *transition);
/// 动画持续时间必须大于0默认0.35秒(默认设置completionSpeed为0.35)
@property (nonatomic, assign) NSTimeInterval transitionDuration;
/// 获取动画类型,默认根据上下文判断
@property (nonatomic, assign) DLAnimatedTransitionType transitionType;
#pragma mark - Interactive
/// 是否启用交互pan手势进行pop|dismiss默认NO。可使用父类属性设置交互动画
@property (nonatomic, assign) BOOL interactEnabled;
/// 是否启用screenEdge交互手势默认NOgestureRecognizer加载前设置生效
@property (nonatomic, assign) BOOL interactScreenEdge;
/// 指定交互pan手势对象默认FWPanGestureRecognizer可设置交互方向滚动视图等
@property (nonatomic, strong) __kindof UIPanGestureRecognizer *gestureRecognizer;
/// 是否正在交互中手势开始才会标记为YES手势结束标记为NO
@property (nonatomic, assign, readonly) BOOL isInteractive;
/// 自定义交互句柄可根据手势state处理不同状态的交互返回YES执行默认交互返回NO不执行。默认为空执行默认交互
@property (nullable, nonatomic, copy) BOOL(^interactBlock)(__kindof UIPanGestureRecognizer *gestureRecognizer);
/// 自定义dismiss关闭动画完成回调默认nil
@property (nullable, nonatomic, copy) void(^dismissCompletion)(void);
/// 手工绑定交互控制器添加pan手势需要vc.view存在时调用才生效。默认自动绑定如果自定义interactBlock必须手工绑定
- (void)interactWith:(UIViewController *)viewController;
#pragma mark - Presentation
/// 是否启用默认展示控制器启用后自动设置presentationBlock返回FWPresentationController默认NO
@property (nonatomic, assign) BOOL presentationEnabled;
/// 设置展示控制器创建句柄自定义弹出效果。present时建议设置modalPresentationStyle为Custom
@property (nullable, nonatomic, copy) UIPresentationController *(^presentationBlock)(UIViewController *presented, UIViewController *presenting);
#pragma mark - Animate
/// 转场上下文,只读
@property (nullable, nonatomic, weak, readonly) id<UIViewControllerContextTransitioning> transitionContext;
/// 标记动画开始(自动添加视图到容器)
- (void)start;
/// 执行动画,子类重写,可选
- (void)animate;
/// 自动标记动画完成(根据transitionContext是否被取消判断)
- (void)complete;
@end
#pragma mark - DLSwipeAnimatedTransition
/// 滑动转场动画类,默认上下
NS_SWIFT_NAME(SwipeAnimatedTransition)
@interface DLSwipeAnimatedTransition : DLAnimatedTransition
/// 创建滑动转场,指定进入(push|present)和消失(pop|dismiss)方向
+ (instancetype)transitionWithInDirection:(UISwipeGestureRecognizerDirection)inDirection
outDirection:(UISwipeGestureRecognizerDirection)outDirection;
/// 指定进入(push|present)方向默认上滑Up
@property (nonatomic, assign) UISwipeGestureRecognizerDirection inDirection;
/// 指定消失(pop|dismiss)方向默认下滑Down
@property (nonatomic, assign) UISwipeGestureRecognizerDirection outDirection;
@end
#pragma mark - DLTransformAnimatedTransition
/// 形变转场动画类,默认缩放
NS_SWIFT_NAME(TransformAnimatedTransition)
@interface DLTransformAnimatedTransition : DLAnimatedTransition
/// 创建形变转场,指定进入(push|present)和消失(pop|dismiss)形变
+ (instancetype)transitionWithInTransform:(CGAffineTransform)inTransform
outTransform:(CGAffineTransform)outTransform;
/// 指定进入(push|present)形变默认缩放0.01
@property (nonatomic, assign) CGAffineTransform inTransform;
/// 指定消失(pop|dismiss)形变默认缩放0.01
@property (nonatomic, assign) CGAffineTransform outTransform;
@end
#pragma mark - DLPresentationController
/// 自定义展示控制器。默认显示暗色背景动画且弹出视图占满容器,可通过属性自定义
NS_SWIFT_NAME(PresentationController)
@interface DLPresentationController : UIPresentationController
/// 是否显示暗色背景默认YES
@property (nonatomic, assign) BOOL showDimming;
/// 是否可以点击暗色背景关闭默认YES。如果弹出视图占满容器手势不生效(因为弹出视图挡住了暗色背景)
@property (nonatomic, assign) BOOL dimmingClick;
/// 是否执行暗黑背景透明度动画默认YES
@property (nonatomic, assign) BOOL dimmingAnimated;
/// 暗色背景颜色默认黑色透明度0.5
@property (nonatomic, strong, nullable) UIColor *dimmingColor;
/// 设置点击暗色背景关闭完成回调默认nil
@property (nonatomic, copy, nullable) void (^dismissCompletion)(void);
/// 设置弹出视图的圆角位置,默认左上和右上。如果弹出视图占满容器,不生效需弹出视图自定义
@property (nonatomic, assign) UIRectCorner rectCorner;
/// 设置弹出视图的圆角半径默认0无圆角。如果弹出视图占满容器不生效需弹出视图自定义
@property (nonatomic, assign) CGFloat cornerRadius;
/// 自定义弹出视图的frame计算block默认nil占满容器优先级高
@property (nonatomic, copy, nullable) CGRect (^frameBlock)(DLPresentationController *presentationController);
/// 设置弹出视图的frame默认CGRectZero占满容器优先级中
@property (nonatomic, assign) CGRect presentedFrame;
/// 设置弹出视图的居中size默认CGSizeZero占满容器优先级中
@property (nonatomic, assign) CGSize presentedSize;
/// 设置弹出视图的顶部距离默认0占满容器优先级低
@property (nonatomic, assign) CGFloat verticalInset;
@end
#pragma mark - DLPanGestureRecognizer
/**
FWPanGestureRecognizer
@note 自动处理与滚动视图pan手势在指定方向的冲突默认设置delegate为自身。如果找到滚动视图则处理之否则同父类
*/
NS_SWIFT_NAME(PanGestureRecognizer)
@interface DLPanGestureRecognizer : UIPanGestureRecognizer
/// 是否自动检测滚动视图默认YES。如需手工指定请禁用之
@property (nonatomic, assign) BOOL autoDetected;
/// 是否按下就立即转换Began状态默认NO需要等待移动才会触发Began
@property (nonatomic, assign) BOOL instantBegan;
/// 指定滚动视图自动处理与滚动视图pan手势在指定方向的冲突。自动设置默认delegate为自身
@property (nullable, nonatomic, weak) UIScrollView *scrollView;
/// 指定与滚动视图pan手势的冲突交互方向默认向下
@property (nonatomic, assign) UISwipeGestureRecognizerDirection direction;
/// 获取当前手势在指定交互方向的滑动进度
@property (nonatomic, assign) CGFloat swipePercent;
/// 指定当前手势在指定交互方向的最大识别距离默认0无限制
@property (nonatomic, assign) CGFloat maximumDistance;
/// 自定义Failed判断句柄。默认判定失败时直接修改状态为Failed可设置此block修改判定条件
@property (nullable, nonatomic, copy) BOOL (^shouldFailed)(DLPanGestureRecognizer *gestureRecognizer);
/// 自定义shouldBegin判断句柄
@property (nullable, nonatomic, copy) BOOL (^shouldBegin)(DLPanGestureRecognizer *gestureRecognizer);
/// 自定义shouldBeRequiredToFail判断句柄
@property (nullable, nonatomic, copy) BOOL (^shouldBeRequiredToFail)(UIGestureRecognizer *otherGestureRecognizer);
/// 自定义shouldRequireFailure判断句柄
@property (nullable, nonatomic, copy) BOOL (^shouldRequireFailure)(UIGestureRecognizer *otherGestureRecognizer);
@end
#pragma mark - UIViewController+DLTransition
/// 视图控制器转场分类如需半透明请在init中设置modalPresentationStyle为UIModalPresentationCustom(注意不会触发原控制器viewWillDisappear:)
@interface UIViewController (DLTransition)
/// 视图控制器present|dismiss转场。注意会修改transitioningDelegate且会强引用之如需weak引用请直接设置transitioningDelegate
@property (nullable, nonatomic, strong) DLAnimatedTransition *dl_modalTransition NS_REFINED_FOR_SWIFT;
/// 视图控制器push|pop转场代理导航控制器转场需在fwNavigationTransition设置后生效
@property (nullable, nonatomic, strong) DLAnimatedTransition *dl_viewTransition NS_REFINED_FOR_SWIFT;
/// 自定义控制器present系统转场(蒙层渐变,内容向上动画)会设置fwModalTransition
- (DLAnimatedTransition *)dl_setPresentTransition:(nullable void (^)(DLPresentationController *))presentationBlock NS_REFINED_FOR_SWIFT;
/// 自定义控制器alert缩放转场(蒙层渐变,内容缩放动画)会设置fwModalTransition
- (DLAnimatedTransition *)dl_setAlertTransition:(nullable void (^)(DLPresentationController *))presentationBlock NS_REFINED_FOR_SWIFT;
/// 自定义控制器fade渐变转场(蒙层和内容渐变动画)会设置fwModalTransition;
- (DLAnimatedTransition *)dl_setFadeTransition:(nullable void (^)(DLPresentationController *))presentationBlock NS_REFINED_FOR_SWIFT;
/// 设置iOS13默认present手势下拉dismiss时的回调block仅iOS13生效自动触发手工dismiss不会触发。会自动设置presentationController.delegate
@property (nonatomic, copy, nullable) void (^dl_presentationDidDismiss)(void) NS_REFINED_FOR_SWIFT;
/// 自定义控制器popover弹出效果(preferredContentSize设置大小)会自动设置modalPresentationStyle和popoverPresentationController.delegate
- (void)dl_setPopoverPresentation:(void (NS_NOESCAPE ^ _Nullable)(UIPopoverPresentationController *))presentationBlock shouldDismiss:(BOOL)shouldDismiss NS_REFINED_FOR_SWIFT;
@end
#pragma mark - UIView+DLTransition
/// 自定义视图模拟转场分类
@interface UIView (DLTransition)
/// 转场添加到指定控制器(pinEdges占满父视图)返回父容器视图。VC.tabBarController.view > VC.navigationController.view > VC.view
- (UIView *)dl_transitionToController:(UIViewController *)viewController pinEdges:(BOOL)pinEdges NS_REFINED_FOR_SWIFT;
/// 包装到转场控制器(pinEdges占满父视图),返回创建的控制器
- (UIViewController *)dl_wrappedTransitionController:(BOOL)pinEdges NS_REFINED_FOR_SWIFT;
/// 自定义视图模拟present系统转场(蒙层渐变,内容向上动画)
- (void)dl_setPresentTransition:(DLAnimatedTransitionType)transitionType
contentView:(nullable UIView *)contentView
completion:(nullable void (^)(BOOL finished))completion NS_REFINED_FOR_SWIFT;
/// 自定义视图模拟alert缩放转场(蒙层渐变,内容缩放动画)
- (void)dl_setAlertTransition:(DLAnimatedTransitionType)transitionType
completion:(nullable void (^)(BOOL finished))completion NS_REFINED_FOR_SWIFT;
/// 自定义视图模拟fade渐变转场(蒙层和内容渐变动画)
- (void)dl_setFadeTransition:(DLAnimatedTransitionType)transitionType
completion:(nullable void (^)(BOOL finished))completion NS_REFINED_FOR_SWIFT;
@end
#pragma mark - UINavigationController+DLTransition
/// 导航控制器转场分类
@interface UINavigationController (DLTransition)
/// 导航控制器push|pop转场。注意会修改delegate且会强引用之一直生效直到设置为nil。如需weak引用请直接设置delegate
@property (nullable, nonatomic, strong) DLAnimatedTransition *dl_navigationTransition NS_REFINED_FOR_SWIFT;
@end
NS_ASSUME_NONNULL_END