Shazam
一个用于嵌套显示水平和垂直滚动视图的纯 Swift 库。
要求
- iOS 9.0+
- Swift 4.2+
- Xcode 10+
安装
CocoaPods (推荐)
use_frameworks!
pod 'Shazam'
使用
首先确保导入框架
import Shazam
基本上,我们只需要提供要显示的子视图控制器的列表。然后调用一些必要的方法。
让我们看看完成此操作的步骤
创建 ShazamPageViewController 子类
import Shazam
class PageViewController: ShazamPageViewController {
// ...
}
提供将要嵌入到 ShazamPageViewController 的视图控制器
override func numberOfViewControllers(in pageController: ShazamPageViewController) -> Int {
return count
}
override func pageController(_ pageController: ShazamPageViewController, viewControllerAt index: Int) -> (UIViewController & ShazamChildViewController) {
// ...
return viewController
}
所有要在 ShazamPageViewController 内显示的 UIViewController 都应遵循 ShazamChildViewController
协议,通过实现 func shazamChildScrollView() -> UIScrollView
import Shazam
class ChildViewController: UIViewController, ShazamChildViewController {
@IBOutlet weak var tableView: UITableView!
func shazamChildScrollView() -> UIScrollView {
return tableView
}
// ...
}
注意:ChildViewController 的 scrollview 必须保留HeaderView + menuView 的高度。例如,在 Demo 中的 BatmanViewController,你需要设置collectionView Header的高度。
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
guard let pageViewContoller = szPageViewContoller else {
return .zero
}
let headerViewHeight = pageViewContoller.headerViewHeightFor(pageViewContoller)
let menuViewHeight = pageViewContoller.menuViewHeightFor(pageViewContoller)
return CGSize(width: collectionView.bounds.width, height: headerViewHeight + menuViewHeight)
}
提供HeaderView和HeaderView高度
override func headerViewFor(_ pageController: ShazamPageViewController) -> UIView & ShazamHeaderView {
return HeaderView()
}
override func headerViewHeightFor(_ pageController: ShazamPageViewController) -> CGFloat {
return headerViewHeight
}
HeaderView应该遵循ShazamHeaderView
协议,通过实现func userInteractionViews() -> [UIView]?
func userInteractionViews() -> [UIView]? {
return [button]
}
提供menuView和menuView高度
override func menuViewFor(_ pageController: ShazamPageViewController) -> UIView {
return menuView
}
override func menuViewHeightFor(_ pageController: ShazamPageViewController) -> CGFloat {
return menuViewHeight
}
当主scrollview滚动时更新menuView的布局,并在滚动结束时检查状态
override func pageController(_ pageController: ShazamPageViewController, mainScrollViewDidScroll scrollView: UIScrollView) {
menuView.updateLayout(scrollView)
}
override func pageController(_ pageController: ShazamPageViewController,
mainScrollViewDidEndScroll scrollView: UIScrollView) {
menuView.checkState()
}
示例
按照以下 4 个步骤运行示例项目
- 克隆 Shazam 仓库
- 运行
pod install
命令 - 打开 Shazam 工作空间
- 运行 Shazam-Demo 项目。
许可证
Shazam 采用 MIT 许可发布。详情请见 LICENSE 文件。