15

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

4

2 に答える 2