# Flashback
**Repository Path**: luckypia/flashback
## Basic Information
- **Project Name**: Flashback
- **Description**: iOS仿Android手势返回
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2021-11-03
- **Last Updated**: 2022-01-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: IOS, Swift, 手势返回
## README
# Flashback - 超好用第三方的iOS手势返回
[](https://cocoapods.org/pods/Flashback)
[](https://cocoapods.org/pods/Flashback)
[](https://cocoapods.org/pods/Flashback)
[](https://cocoapods.org/pods/Flashback)
## 效果图
## 前言
iOS自带的手势返回因为不是系统级别,也没有强制App使用,而且仅左侧可用,还有很多App不支持,导致了iOS App返回乱象。该库正是为了解决该问题而制作的,**支持全局返回,无论你是present出来的VC,还是各种各样的弹窗,都能返回**,让您的App一路顺滑返回到底。
## Demo例子
To run the example project, clone the repo, and run `pod install` from the Example directory first.
## Install安装
Flashback is available through [CocoaPods](https://cocoapods.org). To install
it, simply add the following line to your Podfile:
```ruby
pod 'Flashback'
```
## Get start使用
1. 启用
```swift
import Flashback
// 禁用系统提供的手势返回
navigationController?.interactivePopGestureRecognizer?.isEnabled = false
// 启用闪回(必要)
FlashbackManager.shared.isEnable = true
// 以上功能仅在普通页面可返回,present出来UIViewController或在window上增加视图,都会导致手势返回无法使用,如果想获取更完整的返回体验,有两种方式。
// 1. 在AppDelegate中使用FlashbackWindow辅助将返回视图提到最上层
self.window = FlashbackWindow(frame: UIScreen.main.bounds.size)
// 2. 使用RxSwift扩展UIWindow的addSubview方法
FlashbackManager.shared.targetWindow?.rx.methodInvoked(#selector(UIWindow.addSubview(_:))).subscribe (onNext: { _ in
FlashbackManager.shared.makeFlashbackToTop()
}).disposed(by: UIApplication.shared.rx.disposeBag)
```
2. 可配置
```swift
let config = FlashbackConfig.default
// 左右侧启用
config.enablePositions = [.left, .right]
// 触发范围
config.triggerRange = 20
// 震动启用
config.vibrateEnable = true
// 震动强度
config.vibrateStyle = .light
// 指示器样式
config.style = .custom
// 指示器背景颜色
config.backgroundColor = .black
// 指示器图片颜色
config.indicatorColor = .yellow
// 上下滚动开启
config.scrollEnable = true
// 震动启用
config.vibrateEnable = true
// 震动强度
config.vibrateStyle = .light
// 忽略顶部高度(顶部不可侧滑返回)
config.ignoreTopHeight = 150
// ...
FlashbackManager.shared.config = config
```
3. 可重写返回逻辑
```swift
// 扩展普通VC
class TestViewController {
// 省略不重要代码...
/// 重写返回
override func onFlashback() {
// super.onFlashback()
self.view.endEditing(true)
}
}
// 扩展VC弹窗手势返回
extension AlertViewController {
/// 弹窗闪回扩展
open func onFlashback() {
self.dismiss()
}
}
```
4. 某些情况下禁用手势返回
```swift
FlashbackManager.shared.enable = {
if let currentVC = FlashbackManager.shared.currentVC(FlashbackManager.shared.targetWindow) {
if currentVC is RwaTestViewController {
return false
}
}
return true
}
```
5. 可前置处理(统一处理弹窗,减少代码侵入)
```swift
// 举例:判断VC上的视图是否满足某个协议,若满足,则执行其返回方法
// 不是一定要满足FlashbackProtocol协议,你可以选择自己的协议,更好的减少代码侵入
FlashbackManager.shared.preFlashback = { targetWindow, currentVC in
// 返回true继续向下执行正常逻辑,返回false终止
if let alertList = currentVC?.view.subviews.filter({ $0 is FlashbackProtocol }),
let lastAlert = alertList.last as? FlashbackProtocol {
lastAlert.onFlashback()
// 返回false不再继续往下执行
return false
}
// ...
// 返回true继续正常执行
return true
}
// 扩展View弹窗
extension AlertView: FlashbackProtocol {
/// 弹窗闪回扩展
open func onFlashback() {
self.dismiss()
}
}
```
6. 可通知返回,您可以全权接管返回逻辑
```swift
// 设置返回模式为通知
FlashbackManager.shared.config.backMode = .notify
// 通知回调
NotificationCenter.default.addObserver(forName: FlashbackManager.FlashbackNotificationName, object: nil, queue: nil) { [weak self] _ in
guard let `self` = self else { return }
// 执行返回逻辑
// self.navigationController?.popViewController(animated: true)
}
```
**注意说明**:
- 在`backMode`为`normal`时,执行顺序为:`键盘收回` -> `preFlashback` -> `onFlashback`
## Update log更新日志
### 2.0.0
1. 解决手势返回时keyWindow变成手势返回的window
移除通过添加window的方式添加手势返回,虽然通过此方式保持手势返回在最上层,但在iOS14以上的机型上返回操作时,会导致keyWindow变成手势返回的window,从而导致一系列的问题。
2. 移除自定义返回栈
3. 解决手势返回时还能操纵页面元素的bug
4. 手势返回时优先自动收回键盘
5. 增加某些情况禁用手势Flashback功能
### 1.3.5
1. 优化闪回配置
### 1.3.4
1. 单词拼写纠错
### 1.3.3
1. 优化回调方法,提高性能
### 1.3.2
1. 移除毛玻璃模糊效果,提高性能
### 1.3.1
1. 增加键盘弹出监听,您可以选择在返回之前先退出键盘
2. 优化代码
### 1.3.0
1. 暴露获取当前控制器方法,可自定义实现
2. 暴露控制器返回动作,可自定义实现
## Existing problems存在问题
1. 左右两侧有一部分像素用于了侧滑返回判断,所以不可使用,可通过修改triggerRange来改变触发范围大小。
## 其他手势返回
```swift
pod 'FDFullscreenPopGesture' # https://github.com/forkingdog/FDFullscreenPopGesture
pod 'TZScrollViewPopGesture' # https://github.com/banchichen/TZScrollViewPopGesture
```
- FDFullscreenPopGesture 为每个UIViewController添加【全屏滑动返回】,但遇到UIScrollView就无效了
- TZScrollViewPopGesture 主要是实现【边缘滑动返回】功能,不过这个是次要,主要是,它提供了给UIScrollView添加【边缘滑动返回】的功能。
这俩不会互相影响,功能互补。他们有交互式视觉差的返回效果,但他们的弱点很明显,只能控制UINavigationController中的UIViewController返回,无法控制其他(模态present出的VC,弹窗等)返回,无法从右侧向左滑返回,可与Flashback一起使用。
> 参考文章: [https://www.jianshu.com/p/0c698f71c49a?ivk_sa=1024320u](https://www.jianshu.com/p/0c698f71c49a?ivk_sa=1024320u)
## Contact me联系我
可通过邮件的方式联系我: 664454335@qq.com
## License许可证
Flashback is available under the MIT license. See the LICENSE file for more info.