高仿微信悬浮小窗口的小框架
目前功能:
1.滑动返回时可选择该控制器是否缩小成浮窗;
2.浮窗可自由拖动,拖动结束后可自动贴边;
3.一键创建、替换、关闭浮窗;
4.自适应横竖屏、键盘弹出;
5.可自定义缓存(控制器信息、默认位置)方案;
6.可自定义展开/闭合的提示音
7.可作用于有或无导航栏的情况
8.可自定义浮窗logo
注意:
1.目前仅作用于NavigationController
之后的更新内容:
1.Swift版本;
2.适配自定义的转场动画
3.更多的控制器整合的浮窗;
4.更多的参数设定;
// 使用单例的形式进行全局操作
[JPSuspensionEntrance sharedInstance];
// 也可以使用单例宏获取
// JPSEInstance
// 绑定了则其delegate及interactivePopGestureRecognizer.delegate都为JPSuspensionEntrance代理
// 切换navigationController需要重新绑定最新的navigationController
JPSEInstance.navCtr = self.navigationController;
// 设置绑定的navigationController的根控制器和没有遵守<JPSuspensionEntranceProtocol>协议的子控制器是否隐藏导航栏
JPSEInstance.isHideNavBar = NO;
// push的控制器需要遵守<JPSuspensionEntranceProtocol>协议才可以变为浮窗
// JPSuspensionEntranceProtocol的代理方法:
/**
* 需要缓存的信息(必须实现,例如url)
*/
- (NSString *)jp_suspensionCacheMsg;
/**
* 浮窗的logo图标(可选)
*/
- (UIImage *)jp_suspensionLogoImage;
/**
* 加载浮窗的logo图标的回调(可选,“jp_suspensionLogoImage”优先调用)
* 当“jp_suspensionLogoImage”没有实现或者返回的是nil才会回调该方法,有值返回则不会执行,需要自定义加载方案,这里只提供调用时机
* Example:
// 在push的控制器中实现的代理方法:
- (UIImage *)jp_suspensionLogoImage {
// 返回下载的图片
return self.logoImage;
}
// 如果jp_suspensionLogoImage没有实现或者返回的是nil则会执行该方法
- (void)jp_requestSuspensionLogoImageWithLogoView:(UIImageView *)logoView {
// 这里使用了sdwebimage来进行下载
__weak typeof(self) weakSelf = self;
[logoView sd_setImageWithURL:[NSURL URLWithString:JPTestImageURLStr] placeholderImage:nil options:SDWebImageTransformAnimatedImage completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
// 保存下载好的图片
if (weakSelf) weakSelf.logoImage = image;
}];
}
*/
- (void)jp_requestSuspensionLogoImageWithLogoView:(UIImageView *)logoView;
/**
* 展开当前浮窗
*/
- (void)pushViewController:(UIViewController<JPSuspensionEntranceProtocol> *)targetVC;
/**
* 闭合/创建/替换浮窗
*/
- (void)popViewController:(UIViewController<JPSuspensionEntranceProtocol> *)targetVC;
// 是否可以播放提示音 默认为no
JPSEInstance.canPlaySound = YES;
// 可在该block中配置展开时的提示音
// 默认为系统的id为1397提示音
JPSEInstance.playSpreadSoundBlock = ^{
};
// 可在该block中配置闭合时的提示音
// 默认为系统的id为1396提示音
JPSEInstance.playShrinkSoundBlock = ^{
};
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 自定义缓存方案
// 当需要缓存时则实现这两个block,会在适当的时机进行回调,缓存可自行另处清除
// 1.关键信息的缓存(例如URL),当浮窗被新建、替换时会调用
JPSEInstance.cacheMsgBlock = ^(NSString *cacheMsg) {
// 缓存操作,可参考Demo
};
// 2.浮窗最新的位置的缓存,当浮窗位置发生改变时会调用
JPSEInstance.cacheSuspensionFrameBlock = ^(CGRect suspensionFrame) {
// 缓存操作,可参考Demo
};
});
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 初始化缓存浮窗
// 获取缓存信息,有缓存关键信息的情况下才创建
NSString *cachaMsg = [[NSUserDefaults standardUserDefaults] stringForKey:JPSuspensionCacheMsgKey];
if (cachaMsg) {
// 1.创建浮窗的控制器
ViewController *vc = [[ViewController alloc] init];
vc.title = cachaMsg;
vc.isHideNavBar = YES;
// 2.获取缓存的浮窗位置
// Demo中使用了NSUserDefaults缓存的x、y值
CGFloat x = [[NSUserDefaults standardUserDefaults] floatForKey:JPSuspensionDefaultXKey];
CGFloat y = [[NSUserDefaults standardUserDefaults] floatForKey:JPSuspensionDefaultYKey];
// 创建浮窗
[JPSEInstance setupSuspensionViewWithTargetVC:vc suspensionXY:CGPointMake(x, y)];
}
});
JPSuspensionEntrance 可通过CocoaPods安装,只需添加下面一行到你的podfile:
pod 'JPSuspensionEntrance'
扣扣:184669029
博客:https://juejin.cn/user/2559318802065390
JPSuspensionEntrance is available under the MIT license. See the LICENSE file for more info.