一个自定义 UINavigationController,它允许导航栏在观察内容视图滚动时也进行滚动。
版本说明
- 版本
2.x
是作为UINavigationController
的子类用 Swift 编写的。 - 版本
2.0.0
引入了 Swift 2.0 语法。 - 版本
3.0.0
引入了 Swift 3.0 语法。 - 版本
4.0.0
引入了 Swift 4.0 语法。 - 版本
5.1.0
引入了 Swift 4.2 语法。
如果您正在寻找 Objective-C 中的分类实现,请确保查看版本 1.x
和之前版本,尽管 2.x
建议使用。
屏幕截图
CocoaPods 配置
pod 'AMScrollingNavbar'
use_frameworks!
使用 Carthage 配置
github "andreamazz/AMScrollingNavbar"
使用方法
请确保使用 ScrollingNavigationController
而不是标准的 UINavigationController
。您可以在 Storyboard 中设置您的 UINavigationController
的类,或者在代码中程序化地创建一个 ScrollingNavigationController
实例。
使用 followScrollView(_: delay:)
来开始跟踪可滚动视图(例如:一个 UIScrollView
或 UITableView
)的滚动。
Swift
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let navigationController = navigationController as? ScrollingNavigationController {
navigationController.followScrollView(tableView, delay: 50.0)
}
}
Objective-C
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[(ScrollingNavigationController *)self.navigationController followScrollView:self.tableView delay:0 scrollSpeedFactor:1 collapseDirection:NavigationBarCollapseDirectionScrollDown followers:nil];
}
使用 stopFollowingScrollview()
来停止行为。请记住在消失时调用此函数。
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
if let navigationController = navigationController as? ScrollingNavigationController {
navigationController.stopFollowingScrollView()
}
}
ScrollingNavigationViewController
为了使代码不重复,您可以让您的视图控制器继承 ScrollingNavigationViewController
,它提供了基础设置实现。您只需调用 followScrollView(_: delay:)
即可。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let navigationController = navigationController as? ScrollingNavigationController {
navigationController.followScrollView(tableView, delay: 50.0)
}
}
关注者
为了将另一个视图(如工具栏)与导航栏并排移动,您可以提供视图或多个视图作为 followers
参数。由于您可能希望关注者向上或向下,您必须在视图开始跟踪导航栏时指定视图的滚动方向。
if let navigationController = navigationController as? ScrollingNavigationController {
navigationController.followScrollView(tableView, delay: 50.0, followers: [NavigationBarFollower(view: customFooter, direction: .scrollDown)])
}
注意,当从控制器导航离开时,追随者可能保持滚动偏移。请参阅处理导航以获取正确的设置。
额外滚动
如果您想要进一步滚动导航栏以让路,可以在调用followScrollView
时使用可选参数additionalOffset
。
TabBar滚动
您也可以在followers
数组中传递一个UITabBar
。
if let navigationController = navigationController as? ScrollingNavigationController {
navigationController.followScrollView(tableView, delay: 50.0, followers: [tabBarController.tabBar])
}
ScrollingNavigationControllerDelegate
您可以通过设置代理来在导航栏状态变化时收到调用。
if let navigationController = navigationController as? ScrollingNavigationController {
navigationController.scrollingNavbarDelegate = self
}
代理函数
func scrollingNavigationController(_ controller: ScrollingNavigationController, didChangeState state: NavigationBarState) {
switch state {
case .collapsed:
print("navbar collapsed")
case .expanded:
print("navbar expanded")
case .scrolling:
print("navbar is moving")
}
}
处理导航
如果拥有滚动视图的视图控制器推送新的控制器,您应在viewWillDisappear(animated:)
中调用showNavbar(animated:)
。
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if let navigationController = navigationController as? ScrollingNavigationController {
navigationController.showNavbar(animated: true)
}
}
滚动到顶部
当用户点击状态栏时,默认情况下可滚动的视图会滚动到其内容顶部。如果您还想显示导航栏,请确保将其包含在您的控制器中。
func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
if let navigationController = navigationController as? ScrollingNavigationController {
navigationController.showNavbar(animated: true, scrollToTop: true)
}
return true
}
滚动速度
可以使用scrollSpeedFactor
可选参数来控制滚动速度。
controller.followScrollView(view, delay: 0, scrollSpeedFactor: 2)
查看示例项目以获取更多详细信息。
作者
Andrea Mazzini。我提供自由职业工作,欢迎联系我。
想要支持这些免费库的开发?请给我买杯咖啡
贡献者
MIT许可
The MIT License (MIT)
Copyright (c) 2014-2019 Andrea Mazzini
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.