Ios 如何通过编程方式创建UIImage来更改UIAbbar上边框的颜色?

Ios 如何通过编程方式创建UIImage来更改UIAbbar上边框的颜色?,ios,swift,uiimage,uitabbar,Ios,Swift,Uiimage,Uitabbar,据我所知,改变上边框颜色的唯一方法是设置背景图像(320x49,顶部有像素线)。在我看来,这是唯一的办法(如果我错了,请纠正我) 有没有一种不使用图像文件的方法可以做到这一点?例如,有人通过以下代码创建UIImage来帮助我更改NavigationBar底部边框: UINavigationBar.appearance().shadowImage = UIImage.colorForNavBar(UIColor.redColor()) extension UIImage { cla

据我所知,改变上边框颜色的唯一方法是设置背景图像(320x49,顶部有像素线)。在我看来,这是唯一的办法(如果我错了,请纠正我)

有没有一种不使用图像文件的方法可以做到这一点?例如,有人通过以下代码创建UIImage来帮助我更改NavigationBar底部边框:

UINavigationBar.appearance().shadowImage = UIImage.colorForNavBar(UIColor.redColor())

extension UIImage {   
    class func colorForNavBar(color: UIColor) -> UIImage {
        let rect = CGRectMake(0.0, 0.0, 1.0, 1.0)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()

        CGContextSetFillColorWithColor(context, color.CGColor)
        CGContextFillRect(context, rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
    }
}
这个解决方案实际上很有效;它会更改底部边框的颜色

我试图将此应用于选项卡栏,但没有任何变化


uitabar.appearance().shadowImage=UIImage.colorForNavBar(.redColor())
您需要为
UINavigationBar.appearance().backgroundImage提供不同的图像

例如:

UINavigationBar.appearance().backgroundImage = UIImage.colorForNavBar(.blackColor())
UINavigationBar.appearance().shadowImage = UIImage.colorForNavBar(.redColor())

你几乎已经回答了你自己的问题。您可以使用
uitabar
执行与使用
UINavigationBar
相同的操作。如果要更改阴影图像(即“上边框”),则必须更改背景图像。直接来自:

选项卡栏的自定义阴影图像。如果选项卡栏没有自定义背景图像,则忽略此属性。要以编程方式设置此属性,请使用shadowImage属性

在你自己的问题中,你似乎意识到了这一点:

更改上边框颜色的唯一方法是设置背景图像(320x49,顶部有像素线)

除了它不是背景图像的顶部有一条线。您只需将背景图像设置为任意值,然后就可以将阴影图像设置为您的首选项

如果在Xcode中打开简单的“选项卡式应用程序”模板,您会发现添加这两行代码(以及您的
UIImage
扩展代码)确实有效:

// White background with red border on top
UITabBar.appearance().backgroundImage = UIImage.colorForNavBar(.whiteColor())
UITabBar.appearance().shadowImage = UIImage.colorForNavBar(.redColor())

通常,其他答案都是正确的-您必须同时设置背景图像和阴影图像。但是,这样做会导致条降低其半透明性(模糊);即使设置了透明图像,该条也将是透明的,而不是半透明的

我们也有类似的需求,但我们希望保持酒吧的半透明性。我们没有设置阴影图像,而是对该条进行了子类化,并放置了一个具有所需颜色的发际线子视图。当条形图布局其子视图时,我们将发际线的框架设置为条形图的宽度,并精确设置为一个像素

以下是结果的屏幕截图:

在项目中包含“我的子视图”后,只需使用以下行设置颜色:

if let tabBar = tabBarController?.tabBar as? ColoredHairlineTabBar {
    tabBar.hairlineColor = ... //Your color
}

简单地将uitabar子类化并在layoutSubviews中向视图添加一个新的子层怎么样

快速示例:

override func layoutSubviews() {
    super.layoutSubviews()

    let topBorder = CALayer()

    let borderHeight: CGFloat = 2

    topBorder.borderWidth = borderHeight
    topBorder.borderColor = UIColor.redColor().CGColor
    topBorder.frame = CGRect(x: 0, y: -1, width: self.frame.width, height: borderHeight)

    self.layer.addSublayer(topBorder)
}

以下是Swift 3解决方案:

extension UIImage {
    class func colorForNavBar(color: UIColor) -> UIImage {
        let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)
        //    Or if you need a thinner border :
        //    let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 0.5)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()

        context!.setFillColor(color.cgColor)
        context!.fill(rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image!
    }
}
在UITabBarController的viewDidLoad中与上述代码一起使用

UITabBar.appearance().backgroundImage = UIImage.colorForNavBar(color: .white)
UITabBar.appearance().shadowImage = UIImage.colorForNavBar(color: .red)

创建特定大小的映像不需要扩展,UIImage有一个非常好的构造函数

为了防止丢失半透明模糊,可以设置条淡色而不是背景图像。您还可以使用屏幕比例确保边框为一个像素,就像原始边框一样:

    let hairlineHeight = CGFloat(1) / UIScreen.main.scale
    tabBar.barTintColor = .white
    tabBar.shadowImage = UIImage(color: .black, size: CGSize(width: 1, height: hairlineHeight))

您是否同时设置了
shadowImage
backgroundImage
?如果您只设置其中一个,它将不起作用。@TIMEX请参阅我的答案,以了解使用
UIImage
的替代解决方案。我的解决方案保留了条形图的半透明性,因此模糊效果将保持活动状态。谢谢!对我来说,最好的解决方案就像一个魅力!感谢那些直接跳到这个答案的人-请注意,“colorForNavBar”是一个自定义UIImage扩展函数,您可以在原始问题中找到。使用颜色和大小的UIImage初始值设定项不再工作,编译器将显示此错误“UIImage?”由于“fileprivate”保护级别,无法访问初始值设定项如果你尝试使用它。我想这个API现在是私有的。