То, что я в основном пытаюсь сделать, это иметь текстовую метку "вырезать" текстовое отверстие в представлении. Я пробовал использовать 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, который не работал. Также, когда я попытался преобразовать CGImage (mask
) в CGColorSpaceCreateDeviceGray()
с помощью .copy(colorSpace:)
, он вернул nil
. Я был на этом в течение двух дней, поэтому любая помощь приветствуется