【发布时间】:2017-07-26 01:54:25
【问题描述】:
我实际上想要做的是有一个文本标签“切割”一个穿过视图的文本形状的洞。我试过使用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)(查看掩码)替换时标记的行正确显示。 掩码(正确)显示为:
但是,一旦我尝试应用此掩码(使用 context.clip(to: rect, mask: mask)),什么也没有发生! 实际结果:
想要的结果是:
但由于某种原因,未正确应用蒙版。
这段代码似乎应该可以工作,因为我一遍又一遍地阅读了文档。我还尝试在单独的 CGContext 中创建掩码,但没有成功。此外,当我尝试使用 .copy(colorSpace:) 将 CGImage (mask) 转换为 CGColorSpaceCreateDeviceGray() 时,它返回了 nil。我已经在这两天了,所以任何帮助表示赞赏
【问题讨论】:
-
我曾经遇到过类似的问题,但我的设置略有不同:
UIControl自定义子类,其中包含UILabel子视图。 -
在我的情况下,在渲染 mas 修复它之前,在标签子视图上调用
setNeedsDisplay()。
标签: ios swift core-graphics cgimage cgimagemaskcreate