是否有任何核心或其他框架方法可以返回表示路径对象的Fill部分的CGPath或某种类型的集合?
我正在寻找基本上与 CGPathCreateCopyByStrokingPath 相反的东西。
在low-level-text-rendering上的一篇文章的帮助下,我能够找到代表字母表每个字母的路径。
问题在于路径是字母的轮廓,而我实际上想要的是一条路径,它只代表字母的填充部分而不是笔画。例如,字母" A"只会由3条不同的线组成。
我目前正在尝试使用类似于过于复杂的16段显示的类来解决这个问题。以下是感兴趣的人的一些示例代码:
const NSUInteger segmentsPerDimension = 4;
const CGFloat oneOverTheNumberOfSegments = 1.0 / segmentsPerDimension;
@implementation PathSegments
- (instancetype)initWithRect:(CGRect)rect {
self = [super init];
[self setSegmentBounds:rect];
_segments = [[NSMutableArray alloc] init];
...
[self addVerticalSegments];
...
return self;
}
- (void)addVerticalSegments {
for (NSUInteger i = 0; i <= segmentsPerDimension; i++) {
[self createColumnSegmentsForRow:i];
}
}
- (void)createColumnSegmentsForRow:(NSUInteger)row {
for (NSUInteger i = 0; i < segmentsPerDimension; i++) {
CGFloat x = _segmentBounds.size.width * oneOverTheNumberOfSegments * row;
CGFloat yEnd = _segmentBounds.size.height * oneOverTheNumberOfSegments * i;
CGFloat yStart = _segmentBounds.size.height * oneOverTheNumberOfSegments * (i + 1);
[self addLineSegmentWithXStart:x YStart:yStart XEnd:x YEnd:yEnd];
}
}
...
@end
答案 0 :(得分:0)
我已经确定返回路径的填充部分没有意义。虽然可以通过填充轮廓来以这种方式定义路径来绘制圆形,矩形或自定义形状,但将填充部分复制到另一个路径是不明确的,因为它只是与您开始时相同的路径。
然后使用GPathAddPath(...)
将分段路径组合成一个完整路径似乎是继续这个路径的方法。使用系列线条和曲线,您可以滚动自己的字母形状。
基于您已定义一组点作为路径段使用的假设的摘录:
_generatedSegmentPath = CGPathCreateMutable();
CGMutablePathRef subPath = CGPathCreateMutable();
...
if (CGPathIsEmpty(subPath)) {
CGPoint start = [[points objectAtIndex:startIndex] CGPointValue];
CGPathMoveToPoint(subPath, nil, start.x, start.y);
}
if (points.count == 2) {
CGPoint point = [[points objectAtIndex:startIndex + indexChange] CGPointValue];
CGPathAddLineToPoint(subPath, nil, point.x, point.y);
}
else {
CGPoint controlPoint = [[points objectAtIndex:startIndex + indexChange] CGPointValue];
CGPoint endPoint = [[points objectAtIndex:startIndex + (2 * indexChange)] CGPointValue];
CGPathAddQuadCurveToPoint(subPath, nil, controlPoint.x, controlPoint.y, endPoint.x, endPoint.y);
}
然后将子路径组合在一起:
CGPathAddPath(_generatedSegmentPath, nil, subPath);