与CGPathCreateCopyByStrokingPath相反?

时间:2015-05-24 14:29:14

标签: ios cgpath cgpathref

是否有任何核心或其他框架方法可以返回表示路径对象的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

1 个答案:

答案 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);