UIProgressBar: Как изменить цвет UILabel в соответствии с цветом фона - PullRequest
0 голосов
/ 16 октября 2018

Я новичок в программировании на iOS.Я хочу создать индикатор выполнения с UIlabel, который также меняет цвет текста в соответствии с цветом фона, например: sample image

Пожалуйста, не отмечайте вопрос как дубликат.Потому что решение, которое я нашел, находится в Obj C или некоторых модулях.Но я хотел найти решение в Swift, потому что не знал об Obj-C.

Спасибо!

1 Ответ

0 голосов
/ 16 октября 2018

Если вы хотите получить быстрый ответ, вот код (измененный с 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()
    }
}

Проверено с детской площадкой

...