匹配"透明"导航栏的颜色

los*_*ion 8 uinavigationbar uikit ios

我有一个设置为半透明的导航栏.我不想改变这个.我在导航栏上设置了条形色调,看起来很棒.然而,我设置的颜色不是显示的"真实"颜色,因为我将半透明设置为"是".

我有另一个有背景的视图.我想将该视图的背景颜色设置为与导航栏相同的颜色.但是设置颜色相同的jsut不起作用.由于导航栏是半透明的.

我希望我的视图背景具有相同的半透明度,以便我的颜色匹配.

再次声明我不想改变导航栏的半透明度或颜色.我想创建一个与导航栏具有相同颜色和半透明度的视图.但是在iOS中你只是将半透明设置为'YES',我不确定真正设置的效果(即可能是alpha).是否有一个公式我可以应用于我的视图背景以匹配导航栏?

Mos*_*she 15

我现在正在查看同样的问题,并使用图层检查器查看导航栏.

事实证明,UINavigationBar实际上有两个彩色层.其中一个是基于你的颜色,一个是半透明的近白色层.

看看这个截图:

在此输入图像描述

有两层.

顶层(标记为A)有我的颜色,在这种情况下,是由蓝色定义的UIColor(red: 0.13, green: 0.20, blue: 0.62, alpha: 1.00).此图层的不透明度设置为.85.

在其下方,有第二层,标记为B,近白色,背景颜色定义为UIColor(white: 0.97, alpha: 0.5).

我还没有弄清楚如何在正在开发的中模仿这个,但是这个截图给了我一些可以使用的东西.我也不确定如何模仿边界,但这应该是一个很好的起点.

编辑:正如我所说,这里有更多信息.

底边:

我昨天花了一些时间在这上面,我发现了一些有趣的东西:a的底部边框UINavigationBar实际上是半像素高UIImageView.它没有图像,但它有一个定义为的背景颜色UIColor(red: 0.0, green: 0.0, blue:0.0, alpha: 0.3).

我不确定为什么他们使用空图像视图而不是a,UIView但我现在有一个理论.当我在我的FilterBar视图上设置边框时,我注意到我的颜色,以完全相同的方式定义,与阴影中的颜色不同UINavigationBar.

首先,我意识到我在FilterBar本身设置了边框和近白色,而barTintColor则在第二层.近白色正在流入边境,所以我为白色添加了另一层.

我的边界仍然是错误的颜色.所以,我挖得更深.我开始将视图对象打印到调试器中,我注意到我的边框颜色是在CGColorSpaceGray颜色空间UIImageView中定义的,并且是在中定义的CGColorSpaceRGB.

在此输入图像描述

为了解决这个问题,我手动创建了我需要的颜色空间,然后是透明的黑色.在设备上,它完美地工作,但在模拟器上,它仍然有点偏.

这是我在Swift中用来制作这种颜色的东西:

    let space : CGColorSpace = CGColorSpaceCreateDeviceRGB()
    let color : CGColor = CGColorCreate(space, [0.0, 0.0, 0.0, 0.3])
Run Code Online (Sandbox Code Playgroud)

将图层的borderColor设置为color和borderWidth为0.5,我看到与本机导航栏几乎相同的视图.我认为这就是为什么UINavigationBar使用a UIImageView为边界.虽然我还没有测试过,但我怀疑它是用于色彩空间的.

在此输入图像描述

图层:

我之前注意到UINavigationBar由三层组成.嗯,实际上,它是_UINavigationBarBackground由多个层组成的私有类,并且只有导航栏启用了半透明时才会出现该背景.

如果禁用半透明,UINavigationBar则会将颜色应用于自身并隐藏背景层次结构.我已经模仿了这种行为FilterBar.

在此输入图像描述

摘要:

总而言之,您需要采取的步骤来模仿UINavigationBar:

  1. 对于颜色,您需要在视图中添加两个图层.最顶层采用您的barTintColor,不透明度为85%.对于不透明版本,请删除多余的图层并直接设置颜色.

  2. 要匹配边框,请使用30%不透明度的黑色,确保您拥有正确的色彩空间,并确保您的背景图层不重叠,否则它们会使您的边框混乱.

  3. 如果您确实想要匹配其行为UINavigationBar,请在状态栏下方使背景视图向上伸展.

您可以在GitHub上的FilterBar中看到我的实现.