Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选项卡栏上的两个颜色项,Swift 可以在选项卡栏上设置两种颜色的项目吗?_Swift_Uitabbarcontroller_Uitabbar_Uitabbaritem - Fatal编程技术网

选项卡栏上的两个颜色项,Swift 可以在选项卡栏上设置两种颜色的项目吗?

选项卡栏上的两个颜色项,Swift 可以在选项卡栏上设置两种颜色的项目吗?,swift,uitabbarcontroller,uitabbar,uitabbaritem,Swift,Uitabbarcontroller,Uitabbar,Uitabbaritem,(我是swift的初学者) 我想要实现的目标: 我希望在活动和非活动状态下,每个项目都有一个白色背景 ->我想要的例子 到目前为止我所尝试的: 我一直在尝试使用一个带有透明、白色和黑色的png,但似乎任何不是透明像素的东西都被视为相同的颜色。(我使用的资源渲染为一个完整的彩色图像,而不是区分黑白) ->我认为它会起作用的资产 我认为这是一条路,但不知道怎么走: (这是一个假设) 我认为这可以通过将背景中的非活动项(第一层,白色)和活动项(第二层,黑色)设置在与我要更改的颜色相同的坐标中来

(我是swift的初学者)

我想要实现的目标:

我希望在活动和非活动状态下,每个项目都有一个白色背景

->我想要的例子


到目前为止我所尝试的:

我一直在尝试使用一个带有透明、白色和黑色的png,但似乎任何不是透明像素的东西都被视为相同的颜色。(我使用的资源渲染为一个完整的彩色图像,而不是区分黑白)

->我认为它会起作用的资产


我认为这是一条路,但不知道怎么走:

(这是一个假设)

我认为这可以通过将背景中的非活动项(第一层,白色)和活动项(第二层,黑色)设置在与我要更改的颜色相同的坐标中来实现:

->第1层和第2层的两个资产


我正在使用带有情节提要引用的情节提要来设置活动和非活动状态资产的初始配置

我正在通过编程设置活动状态颜色

欢迎以更优雅的方式实现这一目标的建议


谢谢:)

为您的TabbarviewController创建子类,并设置颜色:

tabBar.tintColor = .red

我可能会用石英画这个。这是一个非常简单的向量,只需几行代码就可以轻松完成。它还将对状态的变化做出反应,并相应地进行更新。请参见下面的示例
UIView
,该示例正是这样做的:

class TabIcon: UIView {

    var enabled: Bool = false {
        didSet {
            setNeedsDisplay()
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = .clear
        self.isOpaque = false
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func draw(_ rect: CGRect) {

        super.draw(rect)

        let ctx = UIGraphicsGetCurrentContext()

        ctx?.setFillColor(UIColor.white.cgColor)
        ctx?.addEllipse(in: rect)
        ctx?.fillPath()

        ctx?.setFillColor(enabled ? UIColor.purple.cgColor : UIColor.lightGray.cgColor)
        ctx?.addEllipse(in: CGRect(x: rect.minX + 5, y: rect.minY + 5, width: rect.width - 10, height: rect.height - 10))
        ctx?.fillPath()

        ctx?.setFillColor(UIColor.white.cgColor)
        ctx?.addEllipse(in: CGRect(x: rect.minX + 15, y: rect.minY + 15, width: rect.width - 30, height: rect.height - 30))
        ctx?.fillPath()
    }
}
您所要做的就是将此视图用作选项卡图标,在选中时更改enabled属性将自动触发重画。结果如下所示:

当然,请微调我使用的值,使其与您的设计完全匹配。还请注意,我已经硬编码了一些值,您可以根据总体大小的比例来确定帧,以提高重用性


希望这有帮助

谢谢大家的帮助

受@Jake的启发,我不断搜索,发现Xcode有不同的模式来渲染图像资源

作为模板渲染:

默认情况下,将图像作为模板进行渲染。(您可以拍摄任何图像并通过编程对其进行着色,但如果其颜色超过1种,则无法识别)

渲染为原始文件:

另一种模式是按原样渲染图像。因此,它实际上可以识别出它是否有超过一种颜色,并保持这种状态。这允许您使用多种颜色的选项卡栏项


如何修改此属性?

编程方式:

(作为财产)

通过界面生成器:

一,。资产文件夹,2。选择一个资产,3。属性检查器

渲染为:默认、原始图像、模板图像。

---可能会回答您的查询
tabBarItem.image = tabBarImage.withRenderingMode(.alwaysOriginal)

//or

tabBarItem.image = tabBarImage.withRenderingMode(.alwaysTemplate)