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。这会旋转文本并保持间距不变 与所有其他字体一样,这个问题至今仍未解决