去除UINavigationBar默认透明度的方法

UINavigationbar的属性translucent,用来控制导航条的透明度的;

iOS7+版本后,navigationbar的translucent属性默认为YES,及默认带有透明度

[self.navigationController.navigationBar setTranslucent:YES];

接下来,我们说说为什么要去除透明度:

在做项目过程中,美工给出的效果图,根据给出的颜色值(或用取色工具取到的颜色值)去设置导航的颜色时,

//ios7以下的版本设置导航栏背景颜色可以使用
[[UINavigationBar appearance] setTintColor:[UIColor orangeColor]];
//iOS7以后:
[[UINavigationBar appearance] setBarTintColor:[UIColor orangeColor]];

发现颜色总是不对,默认translucent=YES,发现颜色一直和效果图不一样,因为带有一定的透明度

所以去除透明度方法一:设置translucent=NO即可

// 默认带有一定透明效果,可以使用以下方法去除系统效果
[self.navigationController.navigationBar setTranslucent:NO];

这样以为万事大吉,就继续项目,有动态隐藏显示navigationBar的需求,那么问题来了,在动态隐藏显示navigationBar时,遇到问题了

先看看例子Demo吧,再说问题是什么

#import "ViewController.h"

@interface ViewController ()<UIGestureRecognizerDelegate>

@property (nonatomic) BOOL flag;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.view setBackgroundColor:[UIColor lightGrayColor]];

    // 默认带有一定透明效果,可以使用以下方法去除系统效果
    [self.navigationController.navigationBar setTranslucent:NO];

    _flag=YES;

    // 默认navigationBar是隐藏的
    [self.navigationController setNavigationBarHidden:_flag animated:YES];

    UIScrollView *scrollview=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, 200)];
    scrollview.backgroundColor=[UIColor purpleColor];
    [self.view addSubview:scrollview];

    // 给scrollView添加点击事件
    UITapGestureRecognizer *gest=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(clicked)];
    [scrollview addGestureRecognizer:gest];
}

//
// scrollView添加点击事件
//
-(void)clicked
{
    _flag=!_flag;
    [self.navigationController setNavigationBarHidden:_flag animated:YES];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

运行以上代码,会发现,navigationBar带动画的显示隐藏时,scrollView也在跟着动,如下图

隐藏时:

显示时:

后来发现,注释掉设置translucent=NO,即[self.navigationController.navigationBar setTranslucent:NO];这句后scrollView就不动了,如下图:

动态显示时

看一下对比图:

scrollView不跟着动的问题解决了,但是navigationBar的颜色又不对了。。。

所以单纯的设置transluncent=NO,无法满足动态显示隐藏navigationBar的需求,所以需求两种兼容的方法

那么去除默认透明度的方法二就诞生了

在UIViewController的viewDidLoad方法中进行如下设置:

    UIColor *barColour = [UIColor colorWithRed:6/255.0 green:122/255.0 blue:181/255.0 alpha:1];
    UIView *colourView = [[UIView alloc] initWithFrame:CGRectMake(0.f, -20.f, self.view.size.width, 64.f)];
    colourView.opaque = NO;
    colourView.alpha = .7f;
    colourView.backgroundColor = barColour;
    self.navigationController.navigationBar.barTintColor = barColour;
    [self.navigationController.navigationBar.layer insertSublayer:colourView.layer atIndex:1];

为了不在每个viewController中设置(哪怕是写了基类viewController,其他viewController继承它) ,做以下处理

去除默认透明度的方法三:

自定义UINavigationBar,继承系统的UINavigationBar

MyNavigationBar.h文件

#import <UIKit/UIKit.h>

@interface MyNavigationBar : UINavigationBar

@property(nonatomic, strong) CALayer *extraColorLayer;

@end

MyNavigationBar.m文件

#import "MyNavigationBar.h"

@implementation MyNavigationBar

-(void)setBarTintColor:(UIColor *)barTintColor
{
    [super setBarTintColor:barTintColor];
    if (self.extraColorLayer == nil) {
        self.extraColorLayer = [CALayer layer];
        self.extraColorLayer.opacity = 1;// 不透明度
        [self.layer addSublayer:self.extraColorLayer];
    }
    self.extraColorLayer.backgroundColor = barTintColor.CGColor;
}
-(void)layoutSubviews
{
    [super layoutSubviews];
    if (self.extraColorLayer != nil) {
        [self.extraColorLayer removeFromSuperlayer];
        self.extraColorLayer.opacity = 1;
        [self.layer insertSublayer:self.extraColorLayer atIndex:1];
        CGFloat spaceAboveBar = self.frame.origin.y;
        self.extraColorLayer.frame = CGRectMake(0, 0 - spaceAboveBar, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds) + spaceAboveBar);
    }
}

@end

其中self.extraColorLayer.opacity设置的是不透明度,我这边这设置为1,让其没有透明度

UINavigationController* rootController =  [[UINavigationController alloc] initWithNavigationBarClass:[MyNavigationBar class] toolbarClass:nil];[rootController setViewControllers:@[[[ViewController alloc] init]]];[rootController.navigationBar setBarTintColor:[UIColor colorWithRed:6/255.0 green:122/255.0 blue:181/255.0 alpha:1]];[rootController setNavigationBarHidden:NO];
以上代码设置导航颜色

不知道说明白没,先总结到这吧

参考http://stackoverflow.com/questions/18897485/achieving-bright-vivid-colors-for-an-ios-7-translucent-uinavigationbar/19534709
时间: 2024-12-28 21:34:56

去除UINavigationBar默认透明度的方法的相关文章

Android去除系统默认的标题栏和全屏的三种方法

在做应用的时候,很多时候是不需要系统自带的标题栏的,而是自己去实现标题栏,这就要去掉系统的标题栏,下面总结了三种方法.全屏也是一样的道理,也总结了实现的三种方法. (一)去除标题栏 1.方法1 在Activity的onCreate方法中: 1 requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏 2 //注意这句一定要写在setContentView()方法的前面,不然会报错的 但是这种方法的缺陷是,因为在onCreate方法中才去掉标题栏,

修改mysql默认字符集的方法

mysql默认字符集能否进行修改呢?答案是肯定的,下面就将教您两种修改mysql默认字符集的方法,希望对您学习mysql默认字符集方面能有所启迪. (1) 最简单的修改方法,就是修改mysql的my.ini文件中的字符集键值, 如 default-character-set = utf8  character_set_server = utf8 修改完后,重启mysql的服务,service mysql restart 使用 mysql> SHOW VARIABLES LIKE 'charact

ios点击进去去除push红点的方法

ios点击进去去除push红点的方法 by 伍雪颖 [UIApplication sharedApplication].applicationIconBadgeNumber = 0;

关于navigationBar的颜色计算与默认透明度

NavigationBar的默认透明度为85% 颜色叠加计算公式: RGB需要分开计算,以叠加白色背景为例: 原始颜色(217,10,20) 设置透明度85% 计算过程: R=217 + (255-217)*(1-0.85) G=10 + (255-10)*(1-0.85) B=20 + (255-20)*(1-0.85) 关于navigationBar的颜色计算与默认透明度,布布扣,bubuko.com

Cent OS 命令行和窗口界面默认登录切换方法

在 CentOS 中的修改方法如下: 1. root登陆,免得老是sudo 2. 打开/etc/inittab 文件     #vim /etc/inittab 3. 在默认的 run level 设置中,可以看到第一行书写如:      id:5:initdefault:(默认的 run level 等级为 5:即图形模式 3:即命令行模式) 4. 将第一行的 5 修改为 3 即可. 5. 保存文件后重启系统你就可以看见是启动的文本界面了. Cent OS 命令行和窗口界面默认登录切换方法,布

Redhat 7修改默认运行级别方法 --RHEL7使用systemd创建符号链接指向默认运行级别

今天装了下正式版的RHEL7,发现熟悉的inittab中没有了修改默认运行级别,打开inittab如下 [[email protected] init.d]# vi /etc/inittab # inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # Ctrl-Alt-Delete is handled by /etc/s

phpbb3默认编辑器的方法

phpbb3默认编辑器的方法 http://c.tieba.baidu.com/p/3393330443 这段时间,公司需要做一个英文论坛,同时需要后台也是英文的.考虑以后会交给国外公司去打理论坛.很多人都知道国内做论坛第一个想到的就是DZ.但是他官方没有出英文版,同时可能DZ的设计风格不适合外国人的思维.于是将DZ排除了.没办法只有百度了. 在百度上找到一款叫phpBB3的英文论坛系统.发觉他在英文国家里还是挺受欢迎的.而且网站的免费模板也挺多了的.但是有个缺点就是他的编辑器实在太简陋了,简陋

JDBC连接SqlServer数据库(非默认实例)方法

一般我们在连接数据库的时候都是用的默认实例名,今天遇到了用非默认是实例名:连接代码如下(Java): URL=jdbc:microsoft:sqlserver://192.168.1.85//DEMO;DatabaseName=PePsiEasyData 说明: 192.168.1.85是数据库地址.不指定端口 //DEMO 指定实例名为DEMO 也可以写成这样: URL=jdbc:microsoft:sqlserver://192.168.1.85;instanceName=DEMO;Data

Qt编程中QDiaog的ESC键(按下Esc键会默认调用reject()方法)

最近使用QDialog时,按了下Esc键,导致QDialog被关闭,而后续的数据处理出现了问题.原来在QDialog中按下Esc键会默认调用reject()方法而不是closeEvent(QCloseEvent*event)或者其他事件. 处理的方法: (注意:QDialog的close()函数也是会调用reject()函数和关闭函数,若在reject()中直接调用close()也会无法关闭,要先调用hide()) (1)重新实现reject()方法 [html] view plain copy