概述
ResizableController 是用 Swift 编写的自定义模型展示风格。
暗黑模式 | 亮色模式 |
---|---|
![]() |
![]() |
![]() |
![]() |
特性
- 带有 自定义初始/最终高度 的可调整大小的视图控制器。
- 支持所有屏幕和设备,支持 iOS 11.0+
- 提供与较旧版本的 iOS 13 自动展示方式的向下兼容性。
- 100% 兼容其他展示方式。
- 简单集成,只需几行代码。
- 流畅的过渡动画。
- 视控制器大小改变时,提供专门的回调。
- 可以通过向下滑和背景点击来关闭控制器。
- 兼容暗黑和亮色模式。
安装
此版本与 Swift 5 兼容。
CocoaPods
ResizableController 通过 CocoaPods 提供。要安装它,只需在 Podfile 中添加以下行
source '[email protected]:paytmmoney/ResizableController.git'
pod 'ResizableController'
Swift 包管理器
ResizableController 通过 Swift 包管理器 提供。要安装它,请从 URL 添加包依赖项。
https://github.com/paytmmoney/ResizableController
使用方法
ResizableControllerPositionHandler
需要使用可调整大小的转换进行显示的视图控制器需要符合 ResizableControllerPositionHandler
协议。此协议在实现层面继承自 UIViewController。
public protocol ResizableControllerPositionHandler: UIViewController {
var shouldShowSlideUpIndication: Bool { get }
var sliderBackgroundColor: UIColor { get }
var initialTopOffset: CGFloat { get }
var finalTopOffset: CGFloat { get }
func willMoveTopOffset(value: CGFloat)
func didMoveTopOffset(value: CGFloat)
}
上述所有属性都是可选的,可以添加以实现不同的结果。
shouldShowSlideUpIndication
如果不想包含直观的滑动指示器,请重写此属性。默认情况下,非可调整大小的视图控制器将禁用。
sliderBackgroundColor
重写此属性,可以为滑动指示器提供不同的颜色。默认为带有 alpha 0.5 的深灰色。
initialTopOffset
覆盖此属性以给出初始自定义高度,从顶部计算。
建议:将此偏移量视为我们应用于视图的topAnchor约束。
finalTopOffset
覆盖此属性以给出自定义最终高度,从顶部计算。可调整大小的控制器将将其高度从initialTopOffset更改为finalTopOffset。
willMoveTopOffset
覆盖此属性,在视图控制器更改大小之前添加行为。如果您覆盖此属性,务必手动取消视图控制器,因为默认行为将受影响。
didMoveTopOffset
类似于willMoveTopOffset,但在动画完成后触发,并且视图控制器已调整大小。
示例
可调整视图控制器
用于创建可调整大小的控制器。遵守ResizableControllerPositionHandler
并覆盖initialTopOffset
。
import ResizableController
class ResizablePresentedViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
extension ResizablePresentedViewController: ResizableControllerPositionHandler {
// This height 500 is from topAnchor
var initialTopOffset: CGFloat {
500
}
}
固定高度视图控制器
用于创建固定高度控制器。遵守 ResizableControllerPositionHandler
并重写 initialTopOffset
和 finalTopOffset
.
import ResizableController
class FixedHeightPresentedViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
extension FixedHeightPresentedViewController: ResizableControllerPositionHandler {
// This height 500 is from topAnchor
var initialTopOffset: CGFloat {
500
}
// Both initial and final height should be same to make it a fixed height controller
var finalTopOffset: CGFloat {
500
}
}
或者
不重写任何属性,这将为您提供 iOS 13 的自动显示功能,可用于较低的 iOS 版本。
import ResizableController
class FixedHeightPresentedViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
extension ResizablePresentedViewController: ResizableControllerPositionHandler {}
如何模态显示
显示时,请调用以下重载方法
func present(_ viewControllerToPresent: ResizableControllerPositionHandler,
animationDuration: TimeInterval = 0.3,
completion: (() -> Void)? = nil)
示例
let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "ResizablePresentedViewController") as ResizablePresentedViewController
self.present(viewController)
作者
Arjun Baru,Paytmoney Ltd 的 iOS 工程师,paytmmoney.com
您可以通过 [email protected] 联系我
许可证
ResizableController 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。
示例项目
以下是实现 ResizableController 的示例项目 示例项目
建议或反馈?
请随意创建拉取请求、开启问题或在我们 Twitter 上找到我们。