BBALeftSwipePushGestureRecognizer.h 4.45 KB
//
//  BBALeftSwipeGestureRecognizerProtocol.h
//  BBAUIKit
//
//  Created by Jack on 2021/1/25.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@protocol BBALeftSwipePushGestureRecognizerProtocol;
@protocol BBALeftSwipePushGestureRecognizerFromVCProtocol;

@interface BBALeftSwipePushGestureRecognizer : NSObject

/// 左滑Push手势
@property (nonatomic, strong, readonly) UIPanGestureRecognizer *panGesture;
/// 是否已经处于手势过程中
@property (nonatomic, assign, readonly) BOOL interacting;
/// 左滑Push手势代理
@property (nonatomic, weak) id<BBALeftSwipePushGestureRecognizerProtocol> delegate;
/// 系统转场交互对象
@property (nonatomic, strong, readonly) UIPercentDrivenInteractiveTransition *interactiveTransition;
/// 初始化方法
- (instancetype)initWithFromViewController:(UIViewController<BBALeftSwipePushGestureRecognizerFromVCProtocol> *)fromVC;

@end

#pragma mark - FromViewController必须实现的协议
@protocol BBALeftSwipePushGestureRecognizerFromVCProtocol <NSObject>

@required

/// 返回FromVC持有的BBALeftSwipePushGestureRecognizer实例
- (BBALeftSwipePushGestureRecognizer *)leftSwipePushGestureRecognizer;

@end

#pragma mark - 针对ViewController的控制协议
@protocol BBALeftSwipePushGestureRecognizerProtocol <NSObject>

@optional

/***********************************************************************/
/*******************  以下两个方法二选一,必须实现一个  **********************/
/***********************************************************************/

/**
 * @brief 在这个方法内执行Push操作(优先级高于pushGestureToViewController:方法,⚠️两者必须实现其一)
 *
 * @note 实现该方法后,不再使用pushGestureToViewController:获取的toVC进行Push操作
 * @param gestureRecognizer 当前左滑手势管理类
 */
- (void)pushGestureDoPushViewControllerAction:(BBALeftSwipePushGestureRecognizer *)gestureRecognizer;

/**
 * @brief 获取转场目标VC(优先级低于pushGestureDoPushViewControllerAction:方法,⚠️两者必须实现其一)
 *
 * @note 如果不实现pushGestureDoPushViewControllerAction:方法,则必须实现该方法用于自动Push操作
 * @param gestureRecognizer 当前左滑手势管理类
 */
- (UIViewController *)pushGestureToViewController:(BBALeftSwipePushGestureRecognizer *)gestureRecognizer;

/***********************************************************************/
/*******************  以上两个方法二选一,必须实现一个  **********************/
/***********************************************************************/

/// 是否响应(支持)左滑Push手势
- (BOOL)pushGesture:(BBALeftSwipePushGestureRecognizer *)gestureRecognizer shouldBegin:(UIPanGestureRecognizer *)panGesture;

/// 左滑Push手势是否支持同时响应
- (BOOL)pushGesture:(BBALeftSwipePushGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneously:(UIGestureRecognizer *)otherGestureRecognizer;

/// 接收到touch事件时是否响应左滑push手势
- (BOOL)pushGesture:(BBALeftSwipePushGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;

/// 左滑Push手势冲突处理(是否取消otherGesture)
- (BOOL)pushGesture:(BBALeftSwipePushGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;


/// 即将开始左滑push手势动画
- (void)pushGestureWillBeginAnimation:(BBALeftSwipePushGestureRecognizer *)gestureRecognizer;
/// 已经开始左滑push手势动画
- (void)pushGestureDidBeginAnimation:(BBALeftSwipePushGestureRecognizer *)gestureRecognizer;

/// 即将更新左滑push手势动画进度
- (void)pushGesture:(BBALeftSwipePushGestureRecognizer *)gestureRecognizer willUpdateAnimationProgress:(CGFloat)percentage;
/// 已经更新左滑push手势动画进度
- (void)pushGesture:(BBALeftSwipePushGestureRecognizer *)gestureRecognizer didUpdateAnimationProgress:(CGFloat)percentage;

/// 即将取消左滑push手势动画
- (void)pushGestureWillCancelAnimation:(BBALeftSwipePushGestureRecognizer *)gestureRecognizer;
/// 已经取消左滑push手势动画
- (void)pushGestureDidCancelAnimation:(BBALeftSwipePushGestureRecognizer *)gestureRecognizer;

/// 即将完成左滑push手势动画
- (void)pushGestureWillFinishAnimation:(BBALeftSwipePushGestureRecognizer *)gestureRecognizer;
/// 已经完成左滑push手势动画
- (void)pushGestureDidFinishAnimation:(BBALeftSwipePushGestureRecognizer *)gestureRecognizer;


@end

NS_ASSUME_NONNULL_END