Ios 如何使用核心图形翻转曲线拟合文本?

Ios 如何使用核心图形翻转曲线拟合文本?,ios,text,rotation,core-graphics,curve-fitting,Ios,Text,Rotation,Core Graphics,Curve Fitting,我的应用程序绘制了一组圆,然后沿着下面的曲线在其中绘制文本 正如你所看到的,问题是有些文字是上下颠倒的。我很容易发现这种情况,所以我开始尝试反转文本。然而,结果如下 如您所见,字母间距完全混乱 我已经在这一点上卡住了,我看不出它是如何如此严重地丢失间距的&试错法没有找到修复方法。任何帮助都将不胜感激。下面是我代码中相关部分的一个片段 #define DEGREES_TO_RADIANS(degrees) ((M_PI * degrees)/ 180) - (void)drawCurv

我的应用程序绘制了一组圆,然后沿着下面的曲线在其中绘制文本

正如你所看到的,问题是有些文字是上下颠倒的。我很容易发现这种情况,所以我开始尝试反转文本。然而,结果如下

如您所见,字母间距完全混乱

我已经在这一点上卡住了,我看不出它是如何如此严重地丢失间距的&试错法没有找到修复方法。任何帮助都将不胜感激。下面是我代码中相关部分的一个片段

#define   DEGREES_TO_RADIANS(degrees)  ((M_PI * degrees)/ 180)

- (void)drawCurvedLabelForText:(NSString *)titleText withAngle:(float)angle centre:(CGPoint)centre andRadius:(float)textRadius
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    UIFont *font = [UIFont systemFontOfSize:16.0f];
    char *fontName = (char *)[font.fontName cStringUsingEncoding:NSASCIIStringEncoding];
    CGContextSelectFont(context, fontName, 12, kCGEncodingMacRoman);

    float perimeter = 2 * M_PI * textRadius;

    // detect if text is upside-down and needs rotating
    BOOL invert = (angle > DEGREES_TO_RADIANS(180.0f);
    if (invert)
    {
        titleText = [self reverseString:titleText];
    }

    // draw each letter in turn, with correct rotation for each
    for (NSUInteger index=0; index<[titleText length]; index++)
    {
        CGContextSaveGState(context);

        NSRange range = {index, 1};
        NSString *letter = [titleText substringWithRange:range];
        char *c = (char *)[letter cStringUsingEncoding:NSASCIIStringEncoding];
        CGSize charSize = [letter sizeWithFont:font];

        float x = centre.x + textRadius * cos(angle);
        float y = centre.y + textRadius * sin(angle);

        float rotateAngle = 0.5 * M_PI;
        if (invert)
        {
            // flip the letter 180 degrees the opposite direction so its not upsidedown
            rotateAngle = -0.5 * M_PI;
        }

        // Flip the coordinate system
        CGContextSetTextMatrix(context, CGAffineTransformMake(1.0,0.0,0.0,-1.0,0.0,0.0));

        // draw the text
        CGContextTranslateCTM(context, x, y);
        CGContextRotateCTM(context, (angle - rotateAngle));
        CGContextShowTextAtPoint(context, 0, 0, c, strlen(c));

        CGContextRestoreGState(context);

        float letterAngle = (charSize.width / perimeter * -2 * M_PI);
        angle += letterAngle;
    }
}

- (NSString *)reverseString:(NSString *)source
{
    NSMutableString *target = [NSMutableString string];
    NSUInteger index = [source length];

    while (index > 0)
    {
        index--;
        NSRange subStringRange = NSMakeRange(index, 1);
        [target appendString:[source substringWithRange:subStringRange]];
    }

    return target;
}
#定义度到弧度(度)((M_π*度)/180)
-(void)drawCurvedLabelForText:(NSString*)带角度的标题文本:(浮动)角度中心:(CGPoint)中心和半径:(浮动)文本半径
{
CGContextRef context=UIGraphicsGetCurrentContext();
UIFont*font=[UIFont systemFontOfSize:16.0f];
char*fontName=(char*)[font.fontName cStringUsingEncoding:NSASCIIStringEncoding];
CGContextSelectFont(上下文,fontName,12,kCGEncodingMacRoman);
浮动周长=2*M_PI*textRadius;
//检测文本是否颠倒,是否需要旋转
布尔反转=(角度>度到弧度(180.0f);
如果(反转)
{
titleText=[自反向限制:titleText];
}
//依次画出每个字母,每个字母正确旋转
对于(整数索引=0;索引0)
{
索引--;
NSRange subStringRange=NSMakeRange(索引,1);
[目标appendString:[源substringWithRange:subStringRange]];
}
回报目标;
}
请注意,我是手工输入的,在输入过程中进行了修改,因此它比使用类属性的实际代码更独立,因此上面可能有错误,但逻辑应该是清楚的


我的假设是“字母角度”,它使用最后绘制的字母的宽度来确定在“角度”上添加多少当字母旋转180度时,用于放置下一个字母的变量不知何故是错误的。要么是这个变量,要么是旋转将其移动到了另一个位置&我需要以某种方式用x/y坐标将其偏移。但我没有找到这两个变量的答案,可能是其他原因。

这里是一个w这是一个很好的答案,但不是一个令人满意的答案——使用iOS上唯一可用的单间距字体,即Courier。这会旋转文本并保持间距不变

与所有其他字体一样,这个问题至今仍未解决