SPStorkController入门教程:5分钟学会自定义高度弹窗
想要在iOS应用中实现类似Apple Music、Mail和Podcasts应用中的精美弹窗效果吗?SPStorkController是你的完美选择!这个强大的Swift库让你轻松创建可自定义高度的模态弹窗,支持iOS 10+,完全兼容Swift 4.2和5.0。🎯
📱 什么是SPStorkController?
SPStorkController是一个开源的iOS弹窗控制器库,它模仿了Apple原生应用中的弹窗设计。与传统的全屏模态控制器不同,SPStorkController提供了可自定义高度的底部弹窗,支持手势交互、关闭按钮和指示器动画,让你的应用界面更加现代化和用户友好。
🚀 快速开始:5分钟上手
1. 安装SPStorkController
你可以通过多种方式安装SPStorkController:
CocoaPods(推荐):
pod 'SPStorkController'
Swift Package Manager: 在Xcode中,选择 File > Swift Packages > Add Package Dependency,然后输入仓库地址:
https://github.com/ivanvorobei/SPStorkController
手动安装: 将 Sources/SPStorkController 文件夹拖入你的Xcode项目,确保勾选 Copy items if needed。
2. 基础使用示例
最简单的使用方式是调用 presentAsStork 方法:
import UIKit
import SPStorkController
class ViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let modalController = UIViewController()
self.presentAsStork(modalController)
}
}
⚙️ 自定义高度配置
SPStorkController的核心功能就是自定义弹窗高度。通过 SPStorkTransitioningDelegate,你可以完全控制弹窗的外观和行为:
let modalController = UIViewController()
let transitionDelegate = SPStorkTransitioningDelegate()
// 设置自定义高度(单位:点)
transitionDelegate.customHeight = 350
// 显示关闭按钮
transitionDelegate.showCloseButton = true
// 设置圆角半径
transitionDelegate.cornerRadius = 15
// 配置手势交互
transitionDelegate.swipeToDismissEnabled = true
transitionDelegate.tapAroundToDismissEnabled = true
// 应用到控制器
modalController.transitioningDelegate = transitionDelegate
modalController.modalPresentationStyle = .custom
modalController.modalPresentationCapturesStatusBarAppearance = true
self.present(modalController, animated: true, completion: nil)
高度自适应选项
SPStorkController提供了多种高度控制方式:
- 固定高度:直接设置
customHeight属性 - 自适应内容:不设置高度,让内容决定弹窗大小
- 半屏高度:设置为屏幕高度的一半
- 百分比高度:通过计算屏幕高度的百分比
🎨 高级特性详解
指示器配置
顶部的箭头指示器可以完全自定义:
// 显示/隐藏指示器
transitionDelegate.showIndicator = true
// 自定义指示器颜色
transitionDelegate.indicatorColor = .white
// 滚动时隐藏指示器
transitionDelegate.hideIndicatorWhenScroll = true
// 指示器模式(箭头或线条)
transitionDelegate.indicatorMode = .alwaysLine
触觉反馈
为关键交互添加触觉反馈:
// 设置触觉反馈时机
transitionDelegate.hapticMoments = [.willPresent, .willDismiss]
确认关闭机制
在用户尝试关闭弹窗前请求确认:
class MyModalController: UIViewController, SPStorkControllerConfirmDelegate {
var needConfirm: Bool {
return true // 需要确认
}
func confirm(_ completion: @escaping (Bool) -> ()) {
let alert = UIAlertController(title: "确认关闭?",
message: "您确定要关闭吗?",
preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "确定", style: .destructive) { _ in
completion(true)
})
alert.addAction(UIAlertAction(title: "取消", style: .cancel) { _ in
completion(false)
})
self.present(alert, animated: true)
}
}
// 设置确认代理
transitionDelegate.confirmDelegate = modalController
📱 与UIScrollView集成
如果你的弹窗内容包含滚动视图,SPStorkController提供了完美的交互支持:
class ScrollableModalController: UIViewController, UIScrollViewDelegate {
let scrollView = UIScrollView()
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegate = self
// 添加内容到scrollView...
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
// 启用与SPStorkController的交互
SPStorkController.scrollViewDidScroll(scrollView)
}
}
🛠️ 实际应用场景
场景1:设置菜单弹窗
func showSettings() {
let settingsVC = SettingsViewController()
let delegate = SPStorkTransitioningDelegate()
delegate.customHeight = 400
delegate.showCloseButton = true
delegate.cornerRadius = 20
settingsVC.transitioningDelegate = delegate
settingsVC.modalPresentationStyle = .custom
present(settingsVC, animated: true)
}
场景2:内容详情弹窗
func showProductDetails(product: Product) {
let detailVC = ProductDetailViewController(product: product)
let delegate = SPStorkTransitioningDelegate()
delegate.customHeight = UIScreen.main.bounds.height * 0.7 // 70%屏幕高度
delegate.showIndicator = true
delegate.indicatorColor = .systemBlue
detailVC.transitioningDelegate = delegate
detailVC.modalPresentationStyle = .custom
present(detailVC, animated: true)
}
场景3:表单输入弹窗
func showLoginForm() {
let loginVC = LoginViewController()
let delegate = SPStorkTransitioningDelegate()
delegate.customHeight = 320
delegate.tapAroundToDismissEnabled = false // 防止误触关闭
delegate.swipeToDismissEnabled = false // 防止误滑关闭
loginVC.transitioningDelegate = delegate
loginVC.modalPresentationStyle = .custom
present(loginVC, animated: true)
}
💡 最佳实践与技巧
1. 状态栏样式
class ModalViewController: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent // 设置浅色状态栏
}
}
2. 导航栏集成
使用 SPFakeBar 创建原生的导航栏外观:
let navBar = SPFakeBarView(style: .stork)
navBar.titleLabel.text = "标题"
navBar.leftButton.setTitle("取消", for: .normal)
navBar.leftButton.addTarget(self, action: #selector(dismissAction), for: .touchUpInside)
self.view.addSubview(navBar)
3. 动画优化
// 在显示前准备内容
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// 预加载数据或准备UI
}
// 平滑的转场动画
let transitionDelegate = SPStorkTransitioningDelegate()
transitionDelegate.customHeight = 450
transitionDelegate.cornerRadius = 16
🔧 故障排除
常见问题1:内存泄漏
❌ 错误写法:
controller.transitioningDelegate = SPStorkTransitioningDelegate() // 会导致内存泄漏
✅ 正确写法:
let transitionDelegate = SPStorkTransitioningDelegate()
controller.transitioningDelegate = transitionDelegate
常见问题2:滚动视图交互
如果弹窗内的 UITableView 或 UICollectionView 交互不流畅,确保:
- 实现了
scrollViewDidScroll代理方法 - 调用了
SPStorkController.scrollViewDidScroll(scrollView) - 设置了正确的
contentInset
📚 深入学习资源
核心文件路径
- 主控制器:SPStorkController.swift
- 转场代理:SPStorkTransitioningDelegate.swift
- 演示控制器:SPStorkPresentationController.swift
- 动画控制器:SPStorkPresentingAnimationController.swift
示例项目
查看 Example/stork-controller/ 目录中的完整示例:
- Controller.swift - 主控制器示例
- ModalViewController.swift - 基础弹窗示例
- ModalTableViewController.swift - 表格弹窗示例
🎯 总结
SPStorkController为iOS开发者提供了一个简单而强大的弹窗解决方案。通过本教程,你已经学会了:
- ✅ 如何快速集成SPStorkController到你的项目
- ✅ 如何创建自定义高度的弹窗控制器
- ✅ 如何配置手势交互和关闭确认
- ✅ 如何与滚动视图完美集成
- ✅ 如何应用最佳实践避免常见问题
无论你是要创建设置菜单、内容详情页还是表单输入界面,SPStorkController都能帮助你实现原生级别的用户体验。现在就开始在你的下一个iOS项目中尝试这个强大的弹窗库吧!🚀
记住:好的用户体验从细节开始,而SPStorkController正是帮你打造这些细节的完美工具。✨
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




