iOS:自定义导航栏,随着tableView滚动显示和隐藏

简介:

自定义导航栏,随着tableView滚动显示和隐藏

 

一、介绍

自定义导航栏是APP中很常用的一个功能,通过自定义可以灵活的实现动画隐藏和显示效果。虽然处理系统的导航栏也可以实现,但是这个是有弊端的,因为系统导航栏是全局的,在任何一个地方去修改导航栏内部的结构,其他地方都会改变,需要再次去特殊处理,否则很容易出现不可预知的bug。此时,自定义是最好的选择。

 

二、思想

(1)在控制器将要显示时,隐藏系统的导航栏,显示自定义的导航栏

(2)在控制器将要消失时,显示系统的导航栏,隐藏自定义的导航栏

(3)重写scrollView的代理方法,监测ContentOffst.y偏移,动态控制自定义的导航栏的可见性

 

三、定义

复制代码
@interface XYQNavigationBar : UIView
@property (copy , nonatomic)void(^clickLeftItemBlock)();  // click left button block
@property (copy , nonatomic)void(^clickRightItemBlock)(); // click right button block
@property (copy , nonatomic)NSString *title; // title
@property (assign,nonatomic)UIColor  *titleColor; // title color
@property (strong,nonatomic)UIColor  *navBackgroundColor;// navagationBar background color
@property (strong,nonatomic)UIImage  *navBackgroundImage;// navigationBar background image

+(instancetype)createCustomNavigationBar; //create navigationBar -(void)showCustomNavigationBar:(BOOL)show; //set navigationBar hide, defalut is NO -(void)setupBgImageAlpha:(CGFloat)alpha animation:(NSTimeInterval)duration compeleteBlock:(void (^)())compeleteBlock;// navigationBar background image alpha -(void)setupBgColorAlpha:(CGFloat)alpha animation:(NSTimeInterval)duration compeleteBlock:(void (^)())compeleteBlock;// navigationBar background color alpha -(void)setLftItemImage:(NSString *)imgName leftItemtitle:(NSString *)leftItemtitle textColor:(UIColor *)color; // navigationBar left button has title and image -(void)setRightItemImage:(NSString *)imgName rightItemtitle:(NSString *)rightItemtitle textColor:(UIColor *)color;// navigationBar right button has title and image -(void)setLeftItemImage:(NSString *)imgName; // navigationBar left button only has image -(void)setRightItemImage:(NSString *)imgName; // navigationBar right button only has image @end
复制代码

 

四、实现

复制代码
1)创建

- (void)viewDidLoad {
    [super viewDidLoad];

    //init
    self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
    self.tableView.dataSource = self;
    self.tableView.delegate = self;
    self.navigationBar = [XYQNavigationBar createCustomNavigationBar];
    

    //update(此处可以自由改变导航栏的属性值)
    self.navigationBar.title = @"自定义导航栏";


    //block
    __weak typeof(self) weakSelf = self;
    self.navigationBar.clickLeftItemBlock = ^(){
        [weakSelf.navigationController popViewControllerAnimated:YES];
    };
    self.navigationBar.clickRightItemBlock = ^(){
        [weakSelf.navigationController pushViewController:[[SecondViewController alloc] init] animated:YES];
    };
    

    // add
    [self.view addSubview:self.tableView];
    [self.view addSubview:self.navigationBar];
}

 (2)显示

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    //hide system navigationBar
    [self.navigationController setNavigationBarHidden:YES animated:YES];
    
    //show custom navigationBar
    [self.navigationBar showCustomNavigationBar:YES];
}

 (3)隐藏

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];

    //show system navigationBar
    [self.navigationController setNavigationBarHidden:NO animated:YES];

    //hide custom navigationBar
    [self.navigationBar showCustomNavigationBar:NO];
}

 (4)监测

#pragma mark - public methods
// animation show or hide navigationbar
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    CGFloat offsetY = scrollView.contentOffset.y;
    CGFloat colorOffset = offsetY / 64.0;
    colorOffset = colorOffset > 1 ? 1 : colorOffset;
    
    //method 1 : change backgrundViewImage alpha
    [self.navigationBar setupBgImageAlpha:colorOffset animation:0.4 compeleteBlock:nil];

    //method 2 : change backgrundViewColor alpha
    //[self.navigationBar setupBgColorAlpha:colorOffset animation:0.4 compeleteBlock:nil];

}
复制代码

  

五、效果

 

 

 

六、下载

github:https://github.com/xiayuanquan/XYQNavigationBar.git

 

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/7453908.html ,如需转载请自行联系原作者
相关文章
|
6月前
|
iOS开发 UED
实现一个自定义的iOS动画效果
【4月更文挑战第9天】本文将详细介绍如何在iOS平台上实现一个自定义的动画效果。我们将通过使用Core Animation框架来实现这个动画效果,并展示如何在不同的场景中使用它。文章的目标是帮助读者理解如何使用Core Animation框架来创建自定义动画,并提供一个简单的示例代码。
51 1
|
7天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
30 5
|
14天前
|
Swift iOS开发 UED
实现一个自定义的iOS动画效果
本文介绍如何使用Swift和UIKit在iOS应用中实现一个自定义按钮动画,当按钮被点击时,其颜色从蓝色渐变为绿色,形状从圆形变为椭圆形,释放后恢复原状。通过UIView动画方法实现这一效果,代码示例展示了动画的平滑过渡和状态切换,有助于提升应用的视觉体验和用户交互。
36 1
|
2月前
|
Swift iOS开发 UED
揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【9月更文挑战第5天】本文通过具体案例介绍如何在iOS应用中使用Swift与UIKit实现自定义按钮动画,当用户点击按钮时,按钮将从圆形变为椭圆形并从蓝色渐变到绿色,释放后恢复原状。文中详细展示了代码实现过程及动画平滑过渡的技巧,帮助读者提升应用的视觉体验与特色。
53 11
|
3月前
|
Swift iOS开发 UED
【绝妙创意】颠覆你的视觉体验!揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【8月更文挑战第13天】本文通过一个具体案例,介绍如何使用Swift与UIKit在iOS应用中创建独特的按钮动画效果。当按钮被按下时,其形状从圆形变化为椭圆形,颜色则从蓝色渐变为绿色;释放后,动画反向恢复原状。利用UIView动画方法及弹簧动画效果,实现了平滑自然的过渡。通过调整参数,开发者可以进一步优化动画体验,增强应用的互动性和视觉吸引力。
48 7
|
6月前
ios15从隐藏系统导航栏页面进入显示系统导航栏页面后,期望系统导航栏背景色为白色,但是导航栏背景变成黑色问题
ios15从隐藏系统导航栏页面进入显示系统导航栏页面后,期望系统导航栏背景色为白色,但是导航栏背景变成黑色问题
53 0
|
iOS开发
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
442 0
|
iOS开发
iOS 多个滚动控件嵌套Demo
iOS 多个滚动控件嵌套Demo
69 0
|
API iOS开发
iOS 自定义转场动画 UIViewControllerTransitioning
iOS 自定义转场动画 UIViewControllerTransitioning
87 0
|
Swift iOS开发
iOS 13 之后自定义 Window 不显示解决 (SceneDelegate)
iOS 13 之后自定义 Window 不显示解决 (SceneDelegate)
349 0