iOS Swift:从UILabel创建遮罩

时间:2019-01-17 22:20:31

标签: ios swift uilabel mask

嗨,我正在尝试使用标签作为粒子发射器层的蒙版。

enter image description here

我的粒子发射器已经设置好了,但是从标签上获取遮罩时遇到了问题,这是我的代码,效果不佳。

func emitter() {

    // define emitter layer as centered w 80% of smallest dimension

    let image = emitterImage
    let origin = CGPoint(x: view.bounds.midX - view.bounds.width / 2, y: view.bounds.midY - view.bounds.height / 2)
    let center = CGPoint(x: view.bounds.midX, y: view.bounds.midY)
    let size = CGSize(width: view.bounds.width, height: view.bounds.height)
    let rect = CGRect(origin: origin, size: size)
    let emitterLayer = CAEmitterLayer()
    emitterLayer.emitterShape = CAEmitterLayerEmitterShape.rectangle
    emitterLayer.emitterSize = rect.size
    emitterLayer.emitterPosition = center

    // define cells

    let cell = CAEmitterCell()
    cell.birthRate = Float(size.width * size.height / 10)
    cell.lifetime = 1
    cell.velocity = 10
    cell.scale = 0.1
    cell.scaleSpeed = -0.1
    cell.emissionRange = .pi * 2
    cell.contents = image.cgImage
    emitterLayer.emitterCells = [cell]

    // add the layer

    view.layer.addSublayer(emitterLayer)

    // mask

    let font = UIFont(name: "HelveticaNeue", size: 64)!
    var unichars = [UniChar]("Text".utf16)
    var glyphs = [CGGlyph](repeating: 0, count: unichars.count)
    let gotGlyphs = CTFontGetGlyphsForCharacters(font, &unichars, &glyphs, unichars.count)
    if gotGlyphs {
        let cgpath = CTFontCreatePathForGlyph(font, glyphs[0], nil)!
        let path = UIBezierPath(cgPath: cgpath)
        let mask = CAShapeLayer()
        mask.frame = CGRect(x: 100, y: 100, width: 200, height: 200)
        mask.fillColor = UIColor.clear.cgColor
        mask.strokeColor = UIColor.white.cgColor
        mask.lineWidth = 10.0
        mask.path = path.cgPath
        emitterLayer.mask = mask
    }
}

问题1:我只有第一个字母(“ T”),如何将所有字符路径附加到一个字母中?

if gotGlyphs {
            var paths: [UIBezierPath] = []
            for glyph in glyphs {
                let cgpath = CTFontCreatePathForGlyph(font, glyph, nil)!
                let path = UIBezierPath(cgPath: cgpath)
                paths.append(path)
            }

通过这种方式,我得到了所有字符路径的数组,但是如何附加它们呢?

问题2:路径旋转了180度(为什么?)

1 个答案:

答案 0 :(得分:0)

已解决使用CATextLayer从标签创建遮罩的问题。

let textLayer = CATextLayer()
textLayer.frame = CGRect(x: 0, y: view.bounds.height / 6 * 1, width: yourLabel.frame.width, height: yourLabel.frame.height)
textLayer.rasterizationScale = UIScreen.main.scale
textLayer.contentsScale = UIScreen.main.scale
textLayer.alignmentMode = CATextLayerAlignmentMode.center
textLayer.fontSize = 30
textLayer.font = yourLabel.font
textLayer.isWrapped = true
textLayer.truncationMode = CATextLayerTruncationMode.end
textLayer.string = yourLabel.text
emitterLayer.mask = textLayer