iOS导航栏基础效果配置[通俗易懂]

iOS导航栏基础效果配置

大家好,又见面了,我是你们的朋友全栈君。

  • 标题设置
self.navigationItem.title = @"标题";
复制代码

正常情况下,控制器的标题会默认作为导航标题

  • 前景色
 self.navigationController.navigationBar.barTintColor = [UIColor blueColor];
复制代码
  • 背景色
//注意上层有毛玻璃遮挡
self.navigationController.navigationBar.backgroundColor = [UIColor blueColor];
复制代码
  • 背景图
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"Background"] forBarMetrics:UIBarMetricsDefault];
复制代码
  • 状态栏字体颜色和隐藏

在iOS7之前

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 
[[UIApplication sharedApplication] setStatusBarHidden:YES];
复制代码

iOS7之后

- (UIStatusBarStyle)preferredStatusBarStyle {  
    return UIStatusBarStyleLightContent;  
}  
  
- (BOOL)prefersStatusBarHidden {  
    return YES;  
} 
复制代码

若iOS7之后仍要使用第一种方法全局设置,则需要在plist文件中添加View controller-based status bar appearance 字段,值为NO ,意为不使用控制器管理状态栏。

  • 设置返回按钮
//只设置颜色
self.navigationController.navigationBar.tintColor = [UIColor orangeColor];
复制代码
//设置成图片
UIImage *leftButtonImage = [[UIImage imageNamed:@"image"]
                               imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
                            
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:leftButtonImage
 style:UIBarButtonItemStyleBordered target:self action:@selector(back)];
复制代码
//设置成文字
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回"style:UIBarButtonItemStylePlain target:self action:@selector(back)];
复制代码
//自定义视图
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:view];
复制代码
  • 修复navigationController侧滑手势失效的问题
self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
 // 控制手势在根控制器时不触发
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    return self.childViewControllers.count > 1;
}
复制代码
  • 导航栏透明和底部分隔线
//设置透明的背景图,便于识别底部线条有没有被隐藏
[navigationBar setBackgroundImage:[[UIImage alloc] init] forBarPosition:UIBarPositionAny
                           barMetrics:UIBarMetricsDefault];
//此处使底部线条透明
[navigationBar setShadowImage:[UIImage new]];
复制代码

另外可以通过颜色转图片来修改导航条底部分隔线颜色

//动态地改变UIColor的alpha属性可以返回,不同alpha的图片;可用于动态改变导航条的透明度
+ (UIImage *)imageWithColor:(UIColor *)color{
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

复制代码
  • 全局设置导航栏外观
//全局设置导航栏主题,只在AppDelegate中有效,
或者是UINavagaitonController中的RootController 中设置有效
- (void)setNavigationControllerAppearance {
    [UINavigationBar appearance].barStyle  = UIBarStyleBlack;
    [[UINavigationBar appearance] setBarTintColor:[UIColor colorWithWhite:0.1 alpha:0.5]];
    [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
}

//也可以设置成图片
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav"] forBarMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav"]  forBarMetrics:UIBarMetricsDefault];
复制代码
  • 在导航栏上添加多个按钮
 //方法二
        UIButton* leftButton = [UIButton buttonWithType:UIButtonTypeSystem];
        leftButton.backgroundColor = [UIColor clearColor];
        leftButton.frame = CGRectMake(0, 0, 45, 40);
        [leftButton setImage:[UIImage imageNamed:@"LeftButton_back_Icon"] forState:UIControlStateNormal];
        [leftButton setTitle:@"返回" forState:UIControlStateNormal];
        leftButton.tintColor = [UIColor whiteColor];
        leftButton.autoresizesSubviews = YES;
        leftButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
        leftButton.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin;
        [leftButton addTarget:self action:@selector(goToBack) forControlEvents:UIControlEventTouchUpInside];
        UIBarButtonItem* backItem = [[UIBarButtonItem alloc] initWithCustomView:leftButton];

        self.navigationItem.leftBarButtonItems = @[backItem,closeItem];
复制代码
  • 隐藏导航栏
self.navigationController.navigationBar.hidden = YES;
复制代码
  • 导航栏的动态消失
if (scrollView.contentOffset.y > 64) {
    [self.navigationController setNavigationBarHidden:YES animated:YES];
}else{
    [self.navigationController setNavigationBarHidden:NO animated:YES];
}
复制代码

注意:两种方法都是可以隐藏导航栏的,隐藏之后依然可以使用push和pop方法。但是如果用navigationBar.hidden隐藏导航栏,我们可以继续使用navigationBarHidden提供的滑动pop效果,如果用navigationBarHidden,这个操作将无效;但前者navigationBar.hidden没有系统自动的动画效果。

  • 状态栏的自适应问题
//不让其自动调整
self.automaticallyAdjustsScrollViewInsets = NO;
复制代码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107423.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Springboot+druid数据库连接池使用「建议收藏」

    Springboot+druid数据库连接池使用「建议收藏」1.为什么要使用数据库连接池使用数据库连接池主要考虑到程序与数据库建立连接的性能。创建一个新的数据库是一个很耗时的过程,在使用完之后,可能还需要不断的释放建立的连接,对资源的损耗大。而采用数据库连接池之后,首先就创建了固定数量的数据库连接,需要用的时候使用即可。当然,这样做的一个缺点是,可能某些时候完全没有数据库请求,但是也保持了数据库的最小连接数。浪费了…

    2022年9月15日
  • docker(2)CentOS 7安装docker环境「建议收藏」

    docker(2)CentOS 7安装docker环境「建议收藏」前言前面一篇学了mac安装docker,这篇来学习在linux上安装docker环境准备Docker支持以下的CentOS版本,目前,CentOS仅发行版本中的内核支持Docker。Doc

    2022年7月28日
  • 第一次数学危机_圆周率的诡异现象

    第一次数学危机_圆周率的诡异现象咋看标题,是不是很懵,??数学还有危机,Areukiddingme?!哈哈,当然只是人们对数学的认识的一种突破性的发展的一种描述。那么,我们在之前的描述中,都是在整数的这个范畴。因为在生活的过

    2022年8月2日
  • Laravel Model的 fillable (白名单) 和 guarded (黑名单)属性

    Laravel Model的 fillable (白名单) 和 guarded (黑名单)属性Laravel Model的 fillable (白名单) 和 guarded (黑名单)属性

    2022年4月24日
  • 2022最新前端经典面试试题[通俗易懂]

    1,阐述清楚浮动的几种方式(常见问题)(1)父级div定义height原理:父级div手动定义height,就解决了父级div无法自动获取到高度的问题。优点:简单、代码少、容易掌握缺点:只适合高度固定的布局,要给出精确的高度,如果高度和父级div不一样时,会产生问题(2)父级div定义overflow:hidden原理:必须定义width或zoom:1,同时不能定义heigh…

    2022年4月14日
  • Vue3快速入门教程「建议收藏」

    Vue3快速入门教程「建议收藏」DataProperty模板在<>内的,属于HTMLattribute普通的Mustache语法:双大括号->{{number}}的文本v-bind和v-on的使用创建vm实例时对常用的几个钩子函数的使用方法created(){}mounted(){}以下示例:每秒改变1次msg<!DOCTYPEhtml><htmllang=”en”><head><metacharset=”U..

    2022年5月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号