UIProgressBar:如何根据背景颜色更改 UILabel 颜色

Posted

技术标签:

【中文标题】UIProgressBar:如何根据背景颜色更改 UILabel 颜色【英文标题】:UIProgressBar: How to Change UILabel Color according to Background Color 【发布时间】:2018-10-15 21:07:12 【问题描述】:

我是 ios 编程新手。我想创建一个带有 UIlabel 的进度条,它还可以根据背景颜色更改文本颜色,如下所示:

不要将问题标记为重复。因为我找到的解决方案在 Obj C 或一些 Pod 中。但我想要 Swift 中的解决方案,因为我对 Obj-C 没有任何了解。

谢谢!

【问题讨论】:

我对 obj-c 不太满意,因为我看不懂 obj-c 代码。 能否请您添加您所指的obj-c pod的链接! 如果您喜欢使用 pod,有很多选项,例如:ProgressKit、AMProgressBar、GTProgressBar。 您是如何创建UILabel 的?分享您的代码以创建进度条和标签。 Obj-C 代码:pastebin.com/ZCDmdpPq 【参考方案1】:

如果您想快速得到答案,这里是来自 post 的代码(从 objc 更改为 swift),这应该正是您所需要的:

这是斯威夫特 4

class MyProgressView: UIView 

    var progress: CGFloat = 0 
        didSet 
            setNeedsDisplay()
        
    

    override func draw(_ rect: CGRect) 
        let context = UIGraphicsGetCurrentContext()

        // Set up environment.
        let size = bounds.size
        let backgroundColor = UIColor(red: 108/255, green: 200/255, blue: 226/255, alpha: 1)
        let foregroundColor = UIColor.white
        let font = UIFont.boldSystemFont(ofSize: 42)

        // Prepare progress as a string.
        let progress = NSString(format: "%d%%", Int(round(self.progress * 100))) // this cannot be a String because there are many subsequent calls to NSString-only methods such as `size` and `draw`
        var attributes: [NSAttributedString.Key: Any] = [.font: font]
        let textSize = progress.size(withAttributes: attributes)
        let progressX = ceil(self.progress * size.width)
        let textPoint = CGPoint(x: ceil((size.width - textSize.width) / 2), y: ceil((size.height - textSize.height) / 2))

        // Draw background + foreground text
        backgroundColor.setFill()
        context?.fill(bounds)
        attributes[.foregroundColor] = foregroundColor
        progress.draw(at: textPoint, withAttributes: attributes)

        // Clip the drawing that follows to the remaining progress's frame
        context?.saveGState()
        let remainingProgressRect = CGRect(x: progressX, y: 0, width: size.width - progressX, height: size.height)
        context?.addRect(remainingProgressRect)
        context?.clip()

        // Draw again with inverted colors
        foregroundColor.setFill()
        context?.fill(bounds)
        attributes[.foregroundColor] = backgroundColor
        progress.draw(at: textPoint, withAttributes: attributes)

        context?.restoreGState()
    

在操场上测试

【讨论】:

以上是关于UIProgressBar:如何根据背景颜色更改 UILabel 颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何根据背景颜色自动更改视图的透明颜色

如何根据选择更改 QLabel 的背景颜色

SwiftUI 如何根据获取的数据更改视图的背景颜色?

根据背景图像/颜色更改文本颜色

使用 CSS,如何根据我悬停的单元格更改表格行的背景颜色?

ReactJS 7 - 如何根据其值有条件地仅更改表格单元格(而不是行)的背景颜色?