https://github.com/bawn/shazam
A pure-Swift library for nested display of horizontal and vertical scrolling views
https://github.com/bawn/shazam
ios menuview nestedscrollview page pageviewcontroller scrollview swift
Last synced: about 1 month ago
JSON representation
A pure-Swift library for nested display of horizontal and vertical scrolling views
- Host: GitHub
- URL: https://github.com/bawn/shazam
- Owner: bawn
- License: mit
- Created: 2019-03-04T08:14:55.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2022-04-20T02:10:40.000Z (about 3 years ago)
- Last Synced: 2025-04-12T03:18:36.352Z (about 2 months ago)
- Topics: ios, menuview, nestedscrollview, page, pageviewcontroller, scrollview, swift
- Language: Swift
- Homepage: https://bawn.github.io/#blog
- Size: 6.66 MB
- Stars: 92
- Watchers: 3
- Forks: 20
- Open Issues: 1
-
Metadata Files:
- Readme: README-CHINESE.md
- License: LICENSE
Awesome Lists containing this project
README
# Shazam



[](https://www.apple.com/nl/ios/)
[](https://developer.apple.com/swift/)A pure-Swift library for nested display of horizontal and vertical scrolling views.

## Requirements
- iOS 9.0+
- Swift 4.2+
- Xcode 10+## Installation
#### [CocoaPods](http://cocoapods.org/) (recommended)
```
use_frameworks!pod 'Shazam'
```## Usage
首先需要导入 Shazam
```
import Shazam
```#### 创建 ShazamPageViewController 子类
```swift
import Shazamclass PageViewController: ShazamPageViewController {
// ...
}
```#### 重写协议方法以提供 viewController 和相应的数量
```swift
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` 方法
```swift
import Shazam
class ChildViewController: UIViewController, ShazamChildViewController {@IBOutlet weak var tableView: UITableView!
func shazamChildScrollView() -> UIScrollView {
return tableView
}
// ...
}
```**注意:ChildViewController 的 scrollview 必须在顶部预留 headerView + menuView 的高度,比如在 Demo 里的 BatmanViewController,就需要设置 collectionView 的 Header 高度**
```swift
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 及其高度
```swift
override func headerViewFor(_ pageController: ShazamPageViewController) -> UIView {
return HeaderView()
}override func headerViewHeightFor(_ pageController: ShazamPageViewController) -> CGFloat {
return headerViewHeight
}
```而且 HeaderView 必须遵守 `ShazamHeaderView` 协议,并实现 `func userInteractionViews() -> [UIView]?` 方法
```swift
func userInteractionViews() -> [UIView]? {
return [button]
}
```#### 重写协议方法以提供 menuView 及其高度
```swift
override func menuViewFor(_ pageController: ShazamPageViewController) -> UIView {
return menuView
}override func menuViewHeightFor(_ pageController: ShazamPageViewController) -> CGFloat {
return menuViewHeight
}
```考虑到有时候 menuView 需要高度的定制性,所以设计成由开发者自行提供(demo 中有 menuView 的实现方法)。
#### 更新 menuView 的布局
```swift
override func pageController(_ pageController: ShazamPageViewController, mainScrollViewDidScroll scrollView: UIScrollView) {
menuView.updateLayout(scrollView)
}override func pageController(_ pageController: ShazamPageViewController,
mainScrollViewDidEndScroll scrollView: UIScrollView) {
menuView.checkState()
}
```包括在内容的滚动的时候和停止滚动的时候,具体可参考 demo
## Examples
Follow these 4 steps to run Example project:
1. Clone Shazam repository
2. Run the `pod install` Shazam
3. Open Shazam workspace
4. Run the Shazam-Demo project.### License
Shazam is released under the MIT license. See LICENSE for details.