代码之家  ›  专栏  ›  技术社区  ›  Nicolas Miari

uinavigationbar自定义颜色发际线边框

  •  0
  • Nicolas Miari  · 技术社区  · 7 年前

    首先 ,我在发布这个问题之前搜索过这个问题,但是如果有答案的话,它就隐藏在数百万个关于如何 去除 导航栏的默认下边框。

    我不想删除导航栏的下边框(“阴影”)。


    我正试图通过使用外观代理的常规方法来“主题化”我的应用程序。 我可以全局更改uinavigationbar的大多数视觉属性,代码如下:

    let navigationBarProxy = UINavigationBar.appearance()
    navigationBarProxy.isTranslucent = false
    navigationBarProxy.barTintColor = myBarBackgroundColor
    navigationBarProxy.tintColor = myBarTextColor
    

    关于条形图的“发际线”下边框(或众所周知的“阴影”),我可以通过不做任何操作或指定 nil :

    navigationBarProxy.shadowImage = nil
    

    …或者我可以指定 自定义颜色 通过分配 立体图像 我追求的颜色:

    navigationBarProxy.shadowImage = UIImage.withColor(myBorderColor)
    

    (使用助手扩展名:)

    extension UIImage {
        public static func withColor(_ color: UIColor?, size: CGSize = CGSize(width: 1, height: 1)) -> UIImage? {
            let rect = CGRect(origin: CGPoint.zero, size: size)
            UIGraphicsBeginImageContext(rect.size)
            let context = UIGraphicsGetCurrentContext()
    
            let actualColor = color ?? .clear
            context?.setFillColor(actualColor.cgColor)
            context?.fill(rect)
    
            let image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
    
            return image
        }
    }
    

    然而 上面的方法给了我(在视网膜设备上)一个 1个,2个 边框,而默认的浅灰色边框实际上是 0.5吨,1倍 (也就是“发际线”)。

    有没有任何方法可以实现uinavigationbar的0.5 pt(1px)、自定义彩色下边框(阴影)?


    我想我可以使用运行时生成的背景图像,它大部分是纯色的,但底部有一个1px的边框,颜色是“烘焙”的。但这看起来最好是不雅的,我不知道当导航栏的高度改变时它会如何工作:图像 切片 或者只是拉伸,或者什么?

    2 回复  |  直到 7 年前
        1
  •  1
  •   user9804578    7 年前

    基于在此处找到的所选答案(因为它是旧的,所以有小的更改):

    How to change the border color below the navigation bar?

    // in viewDidLoad
    UIView * navBorder = [[UIView alloc] initWithFrame:CGRectMake(0,
                                                                  self.navigationController.navigationBar.frame.size.height, // <-- same height, not - 1
                                                                  self.navigationController.navigationBar.frame.size.width,
                                                                  1/[UIScreen mainScreen].scale)]; // <-- 5/5S/SE/6 will be 0.5, 6+/X will be 0.33
    // custom color here
    [navBorder setBackgroundColor:customColor];
    
    [self.navigationController.navigationBar addSubview:navBorder];
    


    这里值得一提的是,以计划的方式找到规模: Get device image scale (e.g. @1x, @2x and @3x)

    *注意事项:
    iPhone 6+/x为x3,因此1px高度为0.33磅
    iPhone 5/5s/SE/6为x2,因此1px高度为0.5pt
    在模拟器中测试,可能需要在实际设备上进行验证。

    视觉上与默认导航栏相同,带有自定义颜色。

        2
  •  -1
  •   Prasad Parab    7 年前

    我相信你想去掉阴影。这应该有帮助。

    [[UINavigationBar appearance] setShadowImage:[UIImage new]];
    

    如果你想要有不同颜色的阴影,那么你可以用你想要的颜色创建一个图像,并使用它代替

    [UIImage new]
    

    您可以使用类似的方法自己生成图像

    + (UIImage *)imageWithColor:(UIColor *)color {
        CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
        const CGFloat alpha = CGColorGetAlpha(color.CGColor);
        const BOOL opaque = alpha == 1;
        UIGraphicsBeginImageContextWithOptions(rect.size, opaque, 0);
        CGContextRef context = UIGraphicsGetCurrentContext();
    
        CGContextSetFillColorWithColor(context, [color CGColor]);
        CGContextFillRect(context, rect);
    
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        return image;
    }