一个可自动调整用户滚动情况的缩放(害羞)导航栏,具有可自定义的全高和害羞高度。
目标是尽可能的强大,轻松处理一些边角情况,即使这意味着开发者需要一些额外的集成工作。
如果您已经在Storyboard中设置了Navigation Controller,您需要将 Navigation Controller 场景中的 Navigation Bar 的自定义类指定为 SQTShyNavigationBar
。
当您需要访问shyNavigationBar
属性时,需要导入SQTShyNavigationBar.h
,具体操作如下。
如果您程序性地初始化 Navigation Controller,则需要使用initWithNavigationBarClass:toolbarClass:
初始化器,将[SQTShyNavigationBar class]
传递给*navigationBarClass*
参数。
当您需要访问shyNavigationBar
属性时,需要导入SQTShyNavigationBar.h
,具体操作如下。
假设您正在使用Navigation Controller,您当前子控制器的SQTShyNavigationBar可以通过UINavigationController的shyNavigationBar
属性(通过类扩展添加)访问。
使用此属性,您可以配置SQTShyNavigationBar的各个特性。
害羞高度是导航栏在用户滚动内容到导航栏方向(向上)时所缩放的高度。默认值为20.0点,恰好是当前iOS状态栏的高度。
《完整高度》是指当用户滚动内容离开导航栏(向下)时导航栏扩展的高度。默认值为初始化时设置的框架,通常是44.0点。请注意,此值不包括状态栏的高度。
应在您的初始视图控制器的 viewDidLoad
方法中配置这些高度。在将视图控制器推入/弹出导航堆栈之前更改这些高度将有效,但当前看起来非常糟糕!
例如,下面会导致导航栏“常规”高度为80点(包括状态栏共100点),并缩小至40点(其中20点为状态栏)。
self.navigationController.shyNavigationBar.shyHeight = 44.0f;
self.navigationController.shyNavigationBar.fullHeight = 100.0f;
SQTShyNavigationBar使用混合方法来跟踪滚动,通过使用您的UIScrollView代理的滚动事件的直接通知和内部滑动手势识别器。
如果您尚未实现 scrollViewDidScroll:
UIScrollViewDelegate协议方法,则需要在您的视图控制器中添加它。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[self.navigationController.shyNavigationBar scrollViewDidScroll:scrollView];
}
SQTShyNavigationBar将跟踪通过此方法传递给它的最后一个UIScrollView。
SQTShyNavigationBar有一个名为updateBlock
的属性,允许您设置一个当导航栏缩小或增长时将被调用的块。此块传递3个变量:导航栏的可见帧、"害羞"分数以及子视图的NSArray。害羞分数在害羞高度为0.0,在完整高度为1.0。
此块的自定义实现通常执行“淡出子视图”功能,当栏接近其害羞高度时,导航栏中的标题和/或按钮会淡出。
其他实现是可能的,但留给开发者来实现。 警告:此块允许您对UINavigationBar的子视图进行篡改 - 如果不小心,可能会真的搞砸(也许会直接影响到应用的审核结果)!
shouldSnap
属性默认为YES
,定义了导航栏是否应该在滚动停止并且栏不在害羞高度或完整高度时应“吸附”到最合适的尺寸。
可以通过将enabled
属性设置为NO
禁用导航栏的缩小。
为了帮助SQTShyNavigationBar为导航操作(如推送/弹出另一个视图控制器)做好准备,您需要在viewDidAppear:
和prepareForSegue:sender:
(或viewWillDisappear:
)中实现两个方法。
为了帮助SQTShyNavigationBar处理过渡,建议在viewDidAppear:
中使用的方 法是adjustForSegueInto:scrollView:
,您应传入它应该跟踪的相关UIScrollView。
- (void)viewDidAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController.shyNavigationBar adjustForSequeInto:animated scrollView:self.scrollView];
}
示例使用prepareForSegue:sender:
来调用此方法,但viewWillDisappear:
也应该有效。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UIView *)sender {
// Do other stuff to prepare...
[self.navigationController.shyNavigationBar prepareForSegueAway:YES];
}
shyHeight
和fullHeight
的功能目前存在错误。我希望能够实现这个功能,但我可能只会采用不那么痛苦的方法,并且可能不会在这个库中实现它。Charles Powell
如果您在自己的项目中使用了此功能,请给我留言!