A pure-Swift library for nested display of horizontal and vertical scrolling views.
- iOS 9.0+
- Swift 4.2+
- Xcode 10+
CocoaPods (recommended)
use_frameworks!
pod 'Shazam'
首先需要导入 Shazam
import Shazam
import Shazam
class PageViewController: ShazamPageViewController {
// ...
}
override func numberOfViewControllers(in pageController: ShazamPageViewController) -> Int {
return count
}
override func pageController(_ pageController: ShazamPageViewController, viewControllerAt index: Int) -> (UIViewController & ShazamChildViewController) {
// ...
return viewController
}
所提供的 viewController 必须都遵守 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)
}
override func headerViewFor(_ pageController: ShazamPageViewController) -> UIView {
return HeaderView()
}
override func headerViewHeightFor(_ pageController: ShazamPageViewController) -> CGFloat {
return headerViewHeight
}
而且 HeaderView 必须遵守 ShazamHeaderView
协议,并实现 func userInteractionViews() -> [UIView]?
方法
func userInteractionViews() -> [UIView]? {
return [button]
}
override func menuViewFor(_ pageController: ShazamPageViewController) -> UIView {
return menuView
}
override func menuViewHeightFor(_ pageController: ShazamPageViewController) -> CGFloat {
return menuViewHeight
}
考虑到有时候 menuView 需要高度的定制性,所以设计成由开发者自行提供(demo 中有 menuView 的实现方法)。
override func pageController(_ pageController: ShazamPageViewController, mainScrollViewDidScroll scrollView: UIScrollView) {
menuView.updateLayout(scrollView)
}
override func pageController(_ pageController: ShazamPageViewController,
mainScrollViewDidEndScroll scrollView: UIScrollView) {
menuView.checkState()
}
包括在内容的滚动的时候和停止滚动的时候,具体可参考 demo
Follow these 4 steps to run Example project:
- Clone Shazam repository
- Run the
pod install
Shazam - Open Shazam workspace
- Run the Shazam-Demo project.
Shazam is released under the MIT license. See LICENSE for details.