iOS Swift: создайте маску из UILabel - PullRequest
0 голосов
/ 18 января 2019

Привет. Я пытаюсь использовать метку в качестве маски для слоя эмиттера частиц.

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 голосов
/ 18 января 2019

Решено Использование 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
...