BBASmartPositionProtocol.h 4.29 KB
//
//  BBASmartPositionProtocol.h
//  BBASuspensionBall
//
//  Created by Li,Xufeng on 2019/5/27.
//  Copyright © 2019 Baidu. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>

NS_ASSUME_NONNULL_BEGIN

typedef NSString* BBASmartBallIdentifier;

@protocol BBASBSmartPositionDelegate <NSObject>


/**
 安全边距变化后,悬浮球位置回传

 @param identifier 注册悬浮球时返回的悬浮球唯一标识符 @see registerWithInitFrame:
 @param frame 安全边距改变后的悬浮球位置,采用屏幕坐标系
        注意:如果传回frame为CGrectZero,表示当前屏幕已充满悬浮球,无法规避位置,业务方需自行处理
 */
- (void)smartBall:(BBASmartBallIdentifier)identifier didChageSmartPosition:(CGRect)frame;

@end



@protocol BBASmartPositionProtocol <NSObject>


/**
 注册悬浮球

 @param idPrefix    浮球唯一标识符的参考前缀,TTS建议传入@"TTS",Feed悬浮窗建议传入“SUS”;可传入nil
 
 @param delegate    事件回传代理:比如当接受到安全边距变化时,重新计算后的悬浮球位置将通过此delegate回传;当传入的 initFrame 与已注册的
                    其他球位置冲突时,此delegate也将回调
 @return            悬浮球全局唯一标识符,nil表示注册失败(悬浮球数量达到限制阈值),业务方应当记录此标识,并在回调中判断是否是业务球
 */
- (nullable BBASmartBallIdentifier)registerWithidPrefix:(nullable NSString*)idPrefix delegate:(id<BBASBSmartPositionDelegate>)delegate ;


/**
 触发悬浮球位置计算,通过delete回传位置,一般在调用registerWithidPrefix:delegate:后立即调用此方法,不与registerWithidPrefix:delegate:
                    合并为一个方法有特殊考虑,不用怀疑
 
 @param identifier  注册悬浮球时返回的悬浮球唯一标识符 @see registerWithidPrefix:delegate:
 @param initFrame   悬浮球初始位置,必须传入屏幕坐标系( 业务方使用
                    [ballView.superView convertRect:ballView.frame toView:[UIApplication sharedApplication].delegate.window )

 */
- (void)triggerSmartPositionForBall:(BBASmartBallIdentifier)identifier initFrame:(CGRect)initFrame;


/**
 反注册悬浮球

 @param identifier 注册悬浮球时返回的悬浮球唯一标识符 @see registerWithidPrefix:delegate:
 @return 返回是否反注册成功,当注销一个未注册的identifier时返回NO,否则返回YES
 */
- (BOOL)unRegisterForBall:(BBASmartBallIdentifier)identifier;


/**
 给定悬浮球的推荐位置

 @param identifier 注册悬浮球时返回的悬浮球唯一标识符 @see registerWithidPrefix:delegate:
 @return 悬浮球的坐标+大小,采用屏幕坐标系
 */
- (CGRect)smartPosForBall:(BBASmartBallIdentifier)identifier;


/**
 检查给定的位置是否冲突

 @param initFrame       给定位置,以[UIApplication sharedApplication].delegate.window 为坐标参考系
 @param completeBlock   回传,conflict表示是否与已有悬浮球位置冲突,ballFrames回传当前所有球的位置,
                        以[UIApplication sharedApplication].delegate.window为坐标参考系
 */
- (void)checkConflictForFrame:(CGRect)initFrame completeBlock:(void (^)(BOOL conflict, NSArray<NSValue*> *ballFrames))completeBlock;


/**
 悬浮球拖动结束后通知管理中心悬浮球新位置

 @param identifier 注册悬浮球时返回的悬浮球唯一标识符 @see registerWithidPrefix:delegate:
 @param stopFrame  手指离开屏幕时悬浮球停留的位置,以[UIApplication sharedApplication].delegate.window为坐标参考系
 */
- (void)touchMovedEndForBall:(nonnull BBASmartBallIdentifier)identifier stopFrame:(CGRect)stopFrame;


/**
 排除给定悬浮球外其他所有悬浮球的位置

 @param identifier     注册悬浮球时返回的悬浮球唯一标识符 @see registerWithidPrefix:delegate:
 @return               除去identifier悬浮球外其他所有悬浮球的位置列表,位置参考屏幕坐标系
 */
- (nullable NSArray<NSValue*> *)positionsOfAllSmartBallsExclude:(nullable BBASmartBallIdentifier)identifier;


/**
 通知冲突管理器安全区域变化,从dataSource拿最新的安全区域重新计算悬浮球位置,并通过delegate回传
 */
- (void)safeAreaDidChange;

@end

NS_ASSUME_NONNULL_END