仿知乎主页,上滑隐藏NavigationBar,下滑显示
来源:互联网 发布:c语言 libevent 编辑:程序博客网 时间:2024/04/30 07:10
最近在仿作知乎客户端,知乎首页的 navigationBar 会随着下方的 tableView 滑动而改变,上滑隐藏,下拉显示,并且下拉需要一定速度才会触发显示。在网上查了一下,看到一个随 TableView 滑动改变 NavigationBar 透明度的demo,虽然和自己的需求不一样,但提供了利用 KVO 实现的思路,有了思路就着手做了,调试了几次和知乎官方实现效果稍有不同,但基本需求实现了,如果需要做到完全相同,只要再加一些条件判断就好了,主要代码如下:
#import "TestTableViewController.h"@interface TestTableViewController ()@end@implementation TestTableViewController { BOOL _isHidding;}- (void)viewDidLoad { [super viewDidLoad]; [self setupScrollHideNavigationBar]; self.navigationItem.title = @"TEST DEMO";}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}#pragma mark - Table view data source- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1;}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 50;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; if (!cell) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; } cell.textLabel.text = [NSString stringWithFormat:@"%d",(int)indexPath.row]; return cell;}#pragma mark - 上拉隐藏navigation bar- (void)setupScrollHideNavigationBar { // self.tableView.contentOffset [self.tableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];}- (void)removeScrollHideNavigationBar { //remove [self.tableView removeObserver:self forKeyPath:@"contentOffset"];}#pragma mark KVO- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { if ([object isEqual:self.tableView] && [keyPath isEqualToString:@"contentOffset"]) { CGFloat newY = [change[@"new"] CGPointValue].y; CGFloat oldY = [change[@"old"] CGPointValue].y; float i = newY - oldY; //i>0上滑, i<0下滑 if (self.tableView.contentOffset.y>-64&&self.tableView.contentOffset.y<=24) {//边界条件,此处不精确 if (i<=0&&_isHidding == NO&&self.navigationController.navigationBar.frame.origin.y==20) { //下拉+bar 已经显示的状态,不再移动 return; } _isHidding = NO; self.navigationController.navigationBar.frame = CGRectMake(0, -44-self.tableView.contentOffset.y, 320, 44); }else if (self.tableView.contentOffset.y > 24) { if (i>10) {//更改数值大小可以控制触发 navigation bar 的滑动速度 _isHidding = YES; }else if(i<-10) { _isHidding = NO; }else { } } [self.navigationController setNavigationBarHidden:_isHidding animated:YES]; }}
代码很简单就不详解了,附上各种情况的判断(上滑指手指上滑):
最终效果:
其他:当NavigationController需要 push/pop ViewController的时候注意需要取消KVO,否则在其他界面可能会出现 NavigationBar 隐藏的情况。
参考:
[1] iOS 实现ScrollView 上滑隐藏Navigationbar,下滑显示
[2] 设置navigationbar和statusBar的颜色透明
0 0
- 仿知乎主页,上滑隐藏NavigationBar,下滑显示
- 下滑隐藏上滑显示的Behavior
- CoordinatorLayout、AppBarLayout实现上滑隐藏图片,下滑显示图片
- CoordinatorLayout、FloatingActionButton实现上滑隐藏FloatingActionButton,下滑显示FloatingActionButton
- 上滑 显示底部 下滑 隐藏顶部 协调者布局
- ListView上滑和下滑,显示和隐藏Toolbar
- Android WebView上滑隐藏头部,下滑显示头部
- 上拉下滑手势显示隐藏布局
- iOS 上滑隐藏navigationbar
- 下滑隐藏导航栏 上滑出现
- CoordinatorLayout和AppBarLayout实现上滑隐藏Toolbar,下滑显示Toolbar
- UITableView 上滑动 隐藏搜索框,下滑,显示搜索框
- Android 上滑显示底部导航,下滑显示标题bar
- Android 上滑显示底部导航,下滑显示标题bar
- NavigationBar的隐藏与显示
- 简书的上拉隐藏NavigationBar下拉又显示过程出现黑色背景
- listview的上滑下滑监听,上下滑监听隐藏顶部选项栏
- NavigationBar 隐藏,显示控制(完美解决)
- python 正则匹配
- 常见设计模式之单例模式(Singleton)
- OOM的一些理解与处理
- SpringMvc注解方式开发入门
- IOS-Frameworks-UIKit-UIView.h-frame属性和bounds属性
- 仿知乎主页,上滑隐藏NavigationBar,下滑显示
- 【BZOJ 2453】【JZOJ 2491】维护队列
- 什么是嵌入式系统
- 设计模式-备忘录模式
- servlet中request的作用域(包括存值和取值)
- Unix环境下的Socket编程
- java基础知识2
- 字符串编辑距离及另类
- 人脸对齐SDM