<kbd id='pk7JvZEmvJ19CnI'></kbd><address id='pk7JvZEmvJ19CnI'><style id='pk7JvZEmvJ19CnI'></style></address><button id='pk7JvZEmvJ19CnI'></button>

        查看内容

        如安在iOS 7中配置barTintColor实现相同网易和 Facebook 的 navi_918博天堂COM

        先给代码:https://github.com/allenhsu/CRNavigationController

         

        1. 题目的示意

        信托许多人在 iOS 7 的适配进程中碰着了相同这样的题目。当你试图通过配置 navigationBar.barTintColor 的时辰,你陷入了一个两难的逆境,假设你的预期是这样的:

        怎样在iOS 7中设置barTintColor实现沟通网易和 Facebook 的 navi

        计划稿

        但当 navigationBar.translucent 为 YES 时,你的 navigationBar 看起来也许是这样的:

        怎样在iOS 7中设置barTintColor实现沟通网易和 Facebook 的 navi

        现实环境

         

        最简朴的要领是妥协地配置 translucent 为 NO,于是 navigationBar 的配景致看起来与计划稿同等了,可是计划师也许会跟你吐槽这个 navigationBar 一点也不 iOS 7,他但愿 navBar 照旧可以透出高斯恍惚后的配景。

         

        纵观 App Store,网易消息Facebook 好像较量好地办理了这个题目。

         

        汇集了一些相干资料后自觉找到了不错的办理方案,于是总结成文。

         

        2. iOS 7 中的 barTintColor

        Bar color calculator for iOS7 (UIToolbar and UINavigationBar)》给出了从计划稿色值到 UIColor 的转换和逆转换公式:

         

        假设计划稿中色值为 x(0-255),转换到 UIColor 用的色值用如下公式:

        y = (x - 102) / 0.6

         

        假如取 0-1.0(UIColor 中 RGB 的取值),对应公式:

        y = (x - 0.4) / 0.6

         

        反之:

        x = 0.6 * y + 0.4

         这意味着只配置 barTintColor,你获得的屏幕上功效的 RGB 值均不会小于 102(0.4),换言之,这样的颜色明度较高,无法包围完备的色域。但倘若你的计划稿是一个明度较高的配景致,如灰色 (102, 102, 102),那么只需配置 barTintColor 为纯黑 (0, 0, 0) 就能获得计划稿中所需的配景致,可是大多环境下这个公式无法满意需求。

         

        注:本文所说的屏幕上的功效色值均指与白色底色叠加后的颜色,假设计划稿中色值亦是指白底叠加的环境。


        3. 不美满的办理方案

        Stackoverflow 上有一个办理方案,作者也在 GitHub 附上了代码。这个方案在我看来并不美满,最大的弱点就是代码中输入的色值并非最终屏幕输出的色值(仍以白底为参考),仍有明明色差。这就意味着假如要实现与计划稿同等的结果,你必要通过不绝地调解、取色、比拟来找到一个 Magic Value。不外这个方案给出了一个很好的思绪,即通过叠加一个半透明的 CALayer,来改变 navigationBar 的配景致,可能说进步配景致的明度。

         

        4. 色彩叠加

        为了减小篇幅,这里把色彩叠加简化为两色叠加,假设 c1 是当前颜色,c2 为包围在 c1 上面的颜色,而且透明度(alpha/opacity)为 a,那么叠加后屏幕上的颜色为 (1 - a) * c1 + a * c2。

         

        5. 数学题目

        剩下的事变就是纯数学题目了,标题是:在 2 上钩较所得的颜色上叠加什么颜色和透明度的 Layer,可以获得计划稿中的原色。

         

        假设计划稿色值为 n,传入 barTintColor 的参数也为 n(我要求的所设即所得),按照 2 中公式,navigationBar 自带的配景致为:

        b1 = 0.6 * n + 0.4

        设叠加的 Layer 的配景致为 n2,透明度为 a,那么叠加后获得的颜色为:

        b2 = (1 - a) * b1 + a * n2

           = (1 - a) * (0.6 * n + 0.4) + a * n2

        我但愿:

        b2 = n

        即:

        (1 - a) * (0.6 * n + 0.4) + a * n2 = n

        推导获得:

        n2 = 0.4 * n / a + 0. 6 * x + 0.4 - 0.4 / a

        为了担保 n2 > 0,可以获得:

        a > (0.4 - 0.4 * n) / (0.6 * n + 0.4)

        就是说为了实现部门较深的颜色,a 不得不取较高的值,也就意味着 navBar 的通透度也许会恰当低落,譬喻网易红的例子中,a 或许在 0.78 阁下,以是看起来不那么通透。

         

        该不等式的右边是个递减函数,以是取色值 RGB 中的最小值来计较右式最大值从而获得 a 的最小值,该步对应代码中的:

        CGFloat minVal = MIN(MIN(red, green), blue); 

          

        if ([self convertValue:minVal withOpacity:opacity] < 0) { 

            opacity = [self minOpacityForValue:minVal]; 

        在获得 a 即 opacity 的值后,通过以下代码计较获得叠加的 Layer 的色值: 

        - (CGFloat)convertValue:(CGFloat)value withOpacity:(CGFloat)opacity 

            return 0.4 * value / opacity + 0.6 * value - 0.4 / opacity + 0.4; 

        综上,这样计较出来的叠加层的配景致和透明度可以使得叠加后的功效正好与计划稿的色值同等,至此很好地办理了 iOS 7 中 navigationBar 的 barTintColor 的适配题目,该要领同样合用于办理 UIToolBar 和 UITabBar 的配景致的适配。

         

        最后附上 GitHub 地点:https://github.com/allenhsu/CRNavigationController 样例中,Red 为网易红,Blue 为脸书蓝,自行测试结果。

         

        怎样在iOS 7中设置barTintColor实现沟通网易和 Facebook 的 navi

        CocoaChina是环球最大的苹果开拓中文社区,,官方微信逐日按时推送各类出色的研发教程资源和器材,先容app推广营销履历,最新企业雇用和外包信息,以及Cocos2d引擎、Cocos Studio开拓器材包的最新动态及培训信息。存眷微信可以第一时刻相识最新产物和处事动态,微信在手,全国我有!

        请搜刮微信号“CocoaChina”存眷我们!

        搜刮CocoaChina微信公家号:CocoaChina