核心文字动画中出现位置问题

时间:2019-07-16 14:26:28

标签: ios objective-c core-text

我正在尝试在目标c中转换以下(link)快速代码。

https://stackoverflow.com/a/49100870/797196

CTFontRef helveticaBold = CTFontCreateWithName( CFSTR("Helvetica-Bold"), 60.0, NULL);
NSString* unicodeString =@"Window Title";

CGColorRef color = [UIColor blueColor].CGColor;
NSNumber* underline = [NSNumber numberWithInt:
                       kCTUnderlineStyleSingle|kCTUnderlinePatternDot];

NSDictionary* attributesDict = [NSDictionary dictionaryWithObjectsAndKeys:
                                (__bridge id)helveticaBold, (NSString*)kCTFontAttributeName,
                                color, (NSString*)kCTForegroundColorAttributeName,
                                underline, (NSString*)kCTUnderlineStyleAttributeName, nil];

NSAttributedString* stringToDraw = [[NSAttributedString alloc]
                                    initWithString:unicodeString
                                    attributes:attributesDict];
CGMutablePathRef letters = CGPathCreateMutable();
//    CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)@"Avenir",20,nil);
CTLineRef lines = CTLineCreateWithAttributedString((CFAttributedStringRef)stringToDraw);
CFArrayRef runArray = CTLineGetGlyphRuns(lines);
CAShapeLayer *pathLayer = [CAShapeLayer layer];
for (int i = 0; i < CFArrayGetCount(runArray); i++) {
    CTRunRef run = CFArrayGetValueAtIndex(runArray, i);
    CFDictionaryRef dictRef = CTRunGetAttributes(run);
    NSDictionary *dict = (__bridge NSDictionary*)dictRef;
    CTFontRef runFont = (__bridge CTFontRef)(dict[(NSString*)kCTFontAttributeName]);
    for (int runGlyphIndex=0; runGlyphIndex<CTRunGetGlyphCount(run); runGlyphIndex++) {

        CGGlyph glyph;
        CGPoint position = CGPointZero;
        CTRunGetGlyphs(run, CFRangeMake(runGlyphIndex, 1), &glyph);
        CTRunGetPositions(run, CFRangeMake(runGlyphIndex, 1), &position);
        CGPathRef letter = CTFontCreatePathForGlyph(runFont, glyph, nil);
        CGAffineTransform t = CGAffineTransformMakeTranslation(position.x, position.y);
        CGPathAddPath(letters, &t, letter);
        CAShapeLayer *pathL = [CAShapeLayer layer];
        //            pathLayer.frame = _pathLayerView.bounds;
        CGRect rect = CGPathGetBoundingBox(letter);
        rect.origin = position;
        pathL.frame = rect;
        pathL.geometryFlipped   = true;
        pathL.path              = letter;
        pathL.strokeColor       = UIColor.blueColor.CGColor;
        pathL.fillColor         = UIColor.redColor.CGColor;
        pathL.lineWidth         = 4.0;
        pathL.lineJoin          = kCALineJoinBevel;

        CABasicAnimation *stroke = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
        stroke.fromValue = @(0.0);
        stroke.duration = 3.0f;
        stroke.repeatCount = 0;
        [pathL addAnimation:stroke forKey:nil];

        [pathLayer addSublayer:pathL];
    }
}

[_pathLayerView.layer addSublayer:pathLayer];

但是问题是字母对齐不在所需位置。 “ i”,“ n”,“ o”字母y的位置从顶部开始。显而易见,因为我没有使用字母的位置。

enter image description here

我使用CTRunGetPositions找出字母的位置,但是我不知道如何使用它或在哪里使用它。

0 个答案:

没有答案