在看以下这个开源组件的时候,发现一个非常棒的方法,能够将文字生成path,这样就能够作出用笔写字的效果了。

关键代码:
-(CGPathRef)pathRefFromText

{

    NSAttributedString *attributed = self.attributedText;

    

    CGMutablePathRef letters = CGPathCreateMutable();

    CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)attributed);

    CFArrayRef runArray = CTLineGetGlyphRuns(line);

    for (CFIndex runIndex = 0; runIndex < CFArrayGetCount(runArray); runIndex++)

    {

        CTRunRef run = (CTRunRef)CFArrayGetValueAtIndex(runArray, runIndex);

        CTFontRef runFont = CFDictionaryGetValue(CTRunGetAttributes(run), kCTFontAttributeName);

        

        for (CFIndex runGlyphIndex = 0; runGlyphIndex < CTRunGetGlyphCount(run); runGlyphIndex++)

        {

            CFRange thisGlyphRange = CFRangeMake(runGlyphIndex, 1);

            CGGlyph glyph;

            CGPoint position;

            CTRunGetGlyphs(run, thisGlyphRange, &glyph);

            CTRunGetPositions(run, thisGlyphRange, &position);

            

            CGPathRef letter = CTFontCreatePathForGlyph(runFont, glyph, NULL);

            CGAffineTransform t = CGAffineTransformMakeTranslation(position.x, position.y);

            CGPathAddPath(letters, &t, letter);

            CGPathRelease(letter);

        }

    }

    

    UIBezierPath *path = [UIBezierPath bezierPathWithCGPath:letters];

    CGRect boundingBox = CGPathGetBoundingBox(letters);

    CGPathRelease(letters);

    CFRelease(line);

    

    

    [path applyTransform:CGAffineTransformMakeScale(1.0, -1.0)];

    [path applyTransform:CGAffineTransformMakeTranslation(0.0, boundingBox.size.height)];

    

    

    if (self.reversedAnimation) {

        return [[path bezierPathByReversingPath] CGPath];

    }

    

    return [path CGPath];

}
05-11 16:06