私が本質的にやろうとしているのは、ビューにテキスト型の穴を「カット」するテキスト ラベルを作成することです。使用してみまし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()
usingに変換しようとすると.copy(colorSpace:)
、 が返されnil
ました。私はこれに2日間滞在しているので、助けていただければ幸いです