Сохранение цвета в графическом контексте - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть UILabel с NSMutableAttributedString из foregroundColor: UIColor.red.

Я хочу отобразить метку как UIImage при сохранении ее исходного цвета, но этоотрисовано в черном цвете.

extension NSMutableAttributedString {
    func title(_ text: String, color: UIColor) {
        let attr = [NSAttributedString.Key.foregroundColor: color]
        let str = NSMutableAttributedString(string: text, attributes: attr)
        append(str)
    }
}

extension UIImage {
    class func imageWithLabel(label: UILabel) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0.0)
        label.layer.render(in: UIGraphicsGetCurrentContext()!)
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return img!
    }
}

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 50))
let formattedString = NSMutableAttributedString()
formattedString.title("Hello, world", color: .red)
label.attributedText = formattedString
let image = UIImage.imageWithLabel(label: label) // returns a black label

Как сохранить красный основной цвет надписи в UIImage??

1 Ответ

0 голосов
/ 01 октября 2019

Верьте или нет приписываемые строки умеют рисовать себя, поэтому вы можете просто написать:

extension UIImage {
  class func imageWithLabel(label: UILabel) -> UIImage {
    return UIGraphicsImageRenderer(bounds: label.bounds).image { _ in
      label.attributedText?.draw(in: label.bounds)
    }
  }
}

, но так как вам даже не нужна метка, вы можете просто сделать:

extension NSAttributedString {
  func image(size: CGSize) -> UIImage {
    return UIGraphicsImageRenderer(size: size).image { _ in
      self.draw(at: .zero)
    }
  }
}

См. Документы Apple на розыгрыш

Вот игровая площадка:

import UIKit
import PlaygroundSupport
import UIKit
import PlaygroundSupport

extension NSMutableAttributedString {
    func title(_ text: String, color: UIColor) {
        let attr = [NSAttributedString.Key.foregroundColor: color]
        let str = NSMutableAttributedString(string: text, attributes: attr)
        append(str)
    }
}

extension NSAttributedString {
  func image(size: CGSize) -> UIImage {
    return UIGraphicsImageRenderer(size: size).image { _ in
      self.draw(at: .zero)
    }
  }
}

let segmentedControl = UISegmentedControl.init(frame: .init(origin: .zero, size: .init(width: 160, height: 20)))
let formattedString = NSMutableAttributedString()
formattedString.title("Hello, world", color: .red)
let image = formattedString.image(size: .init(width: 60, height: 20))
segmentedControl.insertSegment(with: image.withRenderingMode(.alwaysOriginal), at: 0, animated: false)
segmentedControl.insertSegment(withTitle: "test", at: 1, animated: false)
segmentedControl.backgroundColor = .white
PlaygroundPage.current.liveView = segmentedControl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...