Swiftpack.co - Package - bawn/Aquaman

Aquaman

License MIT Pod version Platform info Support Swift 4.2

类似于淘票票首页,抖音、简书个人主页的嵌套滚动库

demo

Requirements

  • iOS 9.0+
  • Swift 4.2+
  • Xcode 10+

Installation

CocoaPods (recommended)

use_frameworks!

pod 'Aquaman'

Usage

English documentation

首先需要导入 Aquaman

import Aquaman

创建 AquamanPageViewController 子类

import Aquaman

class PageViewController: AquamanPageViewController {
  // ...
}

重写以下协议方法以提供 viewController 和相应的数量

override func numberOfViewControllers(in pageController: AquamanPageViewController) -> Int {
    return count
}
    
override func pageController(_ pageController: AquamanPageViewController, viewControllerAt index: Int) -> (UIViewController & AquamanChildViewController) {
    // ...
    return viewController
}
    

注意: 所提供的 viewController 必须都遵守 AquamanChildViewController 协议,并实现 func aquamanChildScrollView() -> UIScrollView 方法

import Aquaman
class ChildViewController: UIViewController, AquamanChildViewController {

    @IBOutlet weak var tableView: UITableView!
    func aquamanChildScrollView() -> UIScrollView {
        return tableView
    }
    // ...
}

重写以下协议方法以提供 headerView 及其高度

override func headerViewFor(_ pageController: AquamanPageViewController) -> UIView {
    return HeaderView()
}

override func headerViewHeightFor(_ pageController: AquamanPageViewController) -> CGFloat {
    return headerViewHeight
}

重写以下协议方法以提供 menuView 及其高度

override func menuViewFor(_ pageController: AquamanPageViewController) -> UIView {
    return menuView
}

override func menuViewHeightFor(_ pageController: AquamanPageViewController) -> CGFloat {
    return menuViewHeight
}

Aquaman 采用的是 menuView 和主体功能分离的设计,以满足 menuView 有时候需要深度定制的需求,所以 menuView 需要开发者自己实现,当然这里也提供了现成的 menuView 库:Trident

更新 menuView 的布局

override func pageController(_ pageController: AquamanPageViewController, contentScrollViewDidScroll scrollView: UIScrollView) {
    menuView.updateLayout(scrollView)
}

override func pageController(_ pageController: AquamanPageViewController, didDisplay viewController: (UIViewController & AquamanChildViewController), forItemAt index: Int) {
        menuView.checkState(animation: true)
}

由于 menuView 和 pageController 不存在强关联关系,所以在滚动的时候需要更新 menuView 布局,在显示相应的 viewController 的时候需要检查 menuView 的状态,具体参考 demo

Examples

Follow these 4 steps to run Example project:

  1. Clone Aquaman repository
  2. Run the pod install command
  3. Open Aquaman workspace
  4. Run the Aquaman-Demo project.

License

Aquaman is released under the MIT license. See LICENSE for details.

Github

link
Stars: 188

Dependencies

Used By

Total: 0

Releases

0.1.3 Support SPM - 2020-09-12 03:53:30

0.1.2 代码优化 - 2020-09-11 09:43:40

0.1.0 优化了更新 header view 高度的功能 - 2020-05-19 07:45:44

优化了更新 header view 高度的功能,动画效果更佳

0.0.9 优化实现方式 - 2020-01-04 02:13:01

menuView 悬浮的高度不再需要计算状态栏高度和导航栏高度

0.0.8 增加了 contentInset 功能 - 2019-12-30 09:51:32

0.0.7 新增更新 header view 高度的功能 - 2019-12-10 03:37:53

0.0.5 修复不能滚动和 contentInset 失效的问题 - 2019-09-10 15:25:13

  1. 修复了 MainScrollView 在某些情况下不能滚动的问题
  2. 修复了ChildScrollView 设置 contentInset 失效的问题
  3. 更新了 Demo