私が本質的にやっているのは、テキストラベルにテキストの形の穴を「カット」させることです。私はself.mask = uiLabel
を使ってみましたが、それらはテキストを正しく配置することを拒否しましたので、私はCore Graphicsを通してこれに近づいています。ここでCore Graphics CGImageマスクが影響を受けない
は(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()
に変換しようとしたときに、nil
を返しました。私はこれを2日間行っていますので、どんな助けもあります。
を私は一度、同様の問題がありました私の設定は若干異なります: 'UIControl' cそれに 'UILabel'サブビュー付きのサブクラスを作成します。 –
私の場合、ラベルサブビューで 'setNeedsDisplay()'を呼び出す前に、それを修正しました。 –