gpt4 book ai didi

ios - 核心图形 CGImage 掩码不影响

转载 作者:IT王子 更新时间:2023-10-29 05:19:48 25 4
gpt4 key购买 nike

我基本上想做的是让文本标签在 View 中“切”出一个文本形状的孔。我试过使用 self.mask = uiLabel 但它们拒绝正确定位文本,所以我通过 Core Graphics 来解决这个问题。

这是不起作用的代码(在 draw(_ rect: CGRect) 中):

    let context = (UIGraphicsGetCurrentContext())!

// Set mask background color
context.setFillColor(UIColor.black.cgColor)
context.fill(rect)

context.saveGState()


let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center

let attributes = [
NSParagraphStyleAttributeName: paragraphStyle,
NSFontAttributeName: UIFont.systemFont(ofSize: 16, weight: UIFontWeightMedium),
NSForegroundColorAttributeName: UIColor.white
]

let string = NSString(string: "LOGIN")

// This wouldn't vertically align so we calculate the string size and create a new rect in which it is vertically aligned
let size = string.size(attributes: attributes)
let position = CGRect(
x: rect.origin.x,
y: rect.origin.y + (rect.size.height - size.height) / 2,
width: rect.size.width,
height: size.height
)

context.translateBy(x: 0, y: rect.size.height)
context.scaleBy(x: 1, y: -1)
string.draw(
in: position,
withAttributes: attributes
)

let mask = (context.makeImage())!

context.restoreGState()

// Redraw with created mask
context.clear(rect)

context.saveGState()
// !!!! Below line is the problem
context.clip(to: rect, mask: mask)
context.restoreGState()

基本上,我已经成功地创建了代码来创建一个 CGImage(mask 变量),这是我想应用于整个图像的掩码。

替换context.draw(mask, in: rect) 时标记线(以查看掩码)正确显示。 掩码(正确)显示为:

enter image description here :

然而,一旦我尝试应用此掩码(使用 context.clip(to: rect, mask: mask)),什么都没有发生! 实际结果:

Nothing changing

期望的结果是:

Desired result

但由于某种原因,面具没有被正确应用。


这段代码看起来应该可以工作,因为我已经一遍又一遍地阅读了文档。我还尝试在一个单独的 CGContext 中创建掩码,但没有用。此外,当我尝试使用 .copy(colorSpace:) 将 CGImage (mask) 转换为 CGColorSpaceCreateDeviceGray() 时,它返回了 nil 。我已经在这里工作了两天,所以非常感谢您的帮助

最佳答案

如果您希望标签具有完全半透明的文本,您可以使用混合模式而不是 mask 。

public class KnockoutLabel: UILabel {
public override func draw(_ rect: CGRect) {
let context = UIGraphicsGetCurrentContext()!
context.setBlendMode(.clear)

self.drawText(in: rect)
}
}

确保将 isOpaque 设置为 false;默认情况下, View 假定它是不透明的,因为您使用了不透明的背景颜色。

关于ios - 核心图形 CGImage 掩码不影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45316149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com