Swift 在图形上下文中保留颜色
我有一个Swift 在图形上下文中保留颜色,swift,uikit,Swift,Uikit,我有一个UILabel,带有NSMutableAttributedString的foregroundColor:UIColor.red 我希望将标签渲染为UIImage,同时保留其原始颜色,但渲染为黑色 extension NSMutableAttributedString { func title(_ text: String, color: UIColor) { let attr = [NSAttributedString.Key.foregroundColor: c
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?
?中保留标签的红色前景色?信不信由你,属性字符串知道如何绘制它们自己,因此你可以写:
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)
}
}
}
请参阅上的苹果文档
这里是一个游乐场:
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
不幸的是,这些颜色仍然没有被保留下来。它在我电脑上的操场上工作。你确定问题不在代码的其他地方吗?我已经修改了我的答案,将Xcode 11的整个操场包括在内。试着在那里运行它并查看输出。你是对的。这在操场上确实有效。无可否认,我忽略了一个事实,即我正试图将标签图像用作
UISegmentedControl
段。在操场上,似乎是UISegmentedControl
不尊重颜色。问题是每个段标签中需要两种不同的文本颜色。这是一个与图像或字符串无关的完全不同的问题:大多数uicontrol使用其着色颜色将图像渲染为模板。如果要退出此行为,需要将渲染模式设置为alwaysOriginal;请参见更新的游乐场。