【发布时间】:2017-07-16 16:39:30
【问题描述】:
我试图通过 CGPathRefs 将文本分成所有不同的部分。例如,L 有一条路径并且 ?有两个(点和其余部分)。
目前,我可以将每个字母作为路径但是在“?”的示例中路径同时包含点和其余部分。我想把它们分开,但我似乎无法让它工作。
为了将文本划分为路径,我使用了堆栈溢出的一些答案,它运行良好,这是我将每个字母作为路径的部分。在这里,我还通过“CGPathApply”函数运行它来查看每个单独的点
CGPathRef letter = CTFontCreatePathForGlyph(runFont, glyph, NULL);
NSMutableArray *pathElements = [NSMutableArray array];
CGPathApply(letter, (__bridge void * _Nullable)(pathElements), getPointsFromBezier);
然后我会像这样查看getPointsFromBezier 中的每个点:
void getPointsFromBezier(void *info, const CGPathElement *element){
CGPoint *p = element->points;
NSString *name;
switch (element->type) {
case kCGPathElementMoveToPoint: name = @"kCGPathElementMoveToPoint"; break;
case kCGPathElementAddLineToPoint: name = @"kCGPathElementAddLineToPoint"; break;
case kCGPathElementAddQuadCurveToPoint: name = @"kCGPathElementAddQuadCurveToPoint"; break;
case kCGPathElementAddCurveToPoint: name = @"kCGPathElementAddCurveToPoint"; break;
case kCGPathElementCloseSubpath: name = @"kCGPathElementCloseSubpath"; break;
default: name = @"default"; break;
}
NSLog(@"Type: %@ || Point: %@", name, NSStringFromCGPoint(*p));
}
这给了我这样的输出:
Type: kCGPathElementMoveToPoint || Point: {11.75, 0}
Type: kCGPathElementAddLineToPoint || Point: {11.75, 9.729}
Type: kCGPathElementAddQuadCurveToPoint || Point: {11.75, 11.26}
..
..
Type: kCGPathElementAddQuadCurveToPoint || Point: {13.00, 10.52}
Type: kCGPathElementAddLineToPoint || Point: {13.00, 0}
Type: kCGPathElementCloseSubpath || Point: {13.00, 0}
Type: kCGPathElementMoveToPoint || Point: {12.75, 18.75}
Type: kCGPathElementAddQuadCurveToPoint || Point: {11.5, 18.94}
Type: kCGPathElementAddLineToPoint || Point: {11.5, 19.95}
Type: kCGPathElementAddQuadCurveToPoint || Point: {11.5, 20.41}
..
..
Type: kCGPathElementAddQuadCurveToPoint || Point: {12.75, 18.169}
Type: kCGPathElementCloseSubpath || Point: {12.75, 18.169}
我在这里输入的字符是ก็,我们可以清楚地看到它在输出中有两个不同的路径(即两个kCGPathElementMoveToPoint和两个kCGPathElementCloseSubpath)。
我不确定如何正确或很好地从中创建两个单独的 CGPathRef。
【问题讨论】:
标签: ios objective-c cgpath