Ce que j'essaie essentiellement de faire, c'est d'avoir une étiquette de texte «découper» un trou en forme de texte dans la vue. J'ai essayé d'utiliser self.mask = uiLabel
, mais ceux qui ont refusé de positionner le texte correctement, alors je suis en train d'approcher cela via Core Graphics.Core Graphics CGImage Masque n'affectant pas
est ici le code qui ne fonctionne pas (dans le 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()
Essentiellement, j'ai créé avec succès le code pour créer une CGImage
(la variable mask
) qui est le masque que je veux appliquer à l'image entière.
La ligne marquée lorsque a remplacé avec context.draw(mask, in: rect)
(pour afficher le masque) s'affiche correctement. Le masque montre (correctement) que:
Cependant, une fois que j'essaie d'appliquer ce masque (en utilisant le context.clip(to: rect, mask: mask)
) rien ne se passe !. Résultat réel:
Résultat souhaité est:
mais pour une raison quelconque le masque n'est pas correctement appliqué.
Ce code semble fonctionner correctement car j'ai lu et relu les documents. J'ai également essayé de créer le masque dans un CGContext séparé qui ne fonctionnait pas. Aussi quand j'ai essayé de convertir le CGImage (mask
) en CGColorSpaceCreateDeviceGray()
en utilisant .copy(colorSpace:)
, il a retourné nil
. Cela fait deux jours que je suis là pour toute aide.
J'ai eu un problème similaire une fois , mais ma configuration est légèrement différente: Un 'UIControl' c sous-classe ustom avec une sous-vue 'UILabel'. –
Dans mon cas, appeler 'setNeedsDisplay()' sur la sous-vue label avant de rendre le mas le corrige. –