使用 CGContextScaleCTM 时避免拉伸笔画

Posted

技术标签:

【中文标题】使用 CGContextScaleCTM 时避免拉伸笔画【英文标题】:Avoiding Stretching Stroke when Using CGContextScaleCTM 【发布时间】:2012-08-24 11:43:57 【问题描述】:

我在drawRect 中绘制了一个形状,该形状存储在CGMutablePathRef (shapeMutablePath) 中。每次调用drawRect 时,都会拉伸形状以适应屏幕,并在其周围添加笔划边框。我想知道,如何在不拉伸的情况下绘制笔触边框?即拉伸shapeMutablePath,然后在它周围绘制描边边框,这样每次绘制时它的宽度都相同?我尝试更改比例的顺序以及添加和绘制路径无济于事。

- (void) drawRect:(CGRect)rect

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    CGContextSetRGBFillColor(context, 1.0000, 1.0000, 1.0000, 1.0000);
    CGContextSetRGBStrokeColor(context,0.0000,0.0000,0.0000,1.0000);
    CGContextSetLineWidth(context, DialogueTextViewLineWidth);

    CGContextScaleCTM (context, self.frame.size.width / self.shapeMutablePathWidth, self.frame.size.height / self.shapeMutablePathHeight);
    CGContextAddPath(context, self.shapeMutablePath);
    CGContextDrawPath(context, kCGPathFillStroke);
    CGContextRestoreGState(context);    

【问题讨论】:

【参考方案1】:

而不是缩放 CTM 并使用原始路径:

CGContextScaleCTM (context, self.frame.size.width / self.shapeMutablePathWidth, self.frame.size.height / self.shapeMutablePathHeight);
CGContextAddPath(context, self.shapeMutablePath);

...创建一个转换后的路径并使用它:

CGAffineTransform trn = CGAffineTransformMakeScale(self.bounds.size.width / self.shapeMutablePathWidth, self.bounds.size.height / self.shapeMutablePathHeight);
CGPathRef transformedPath = CGPathCreateCopyByTransformingPath(self.shapeMutablePath, &trn);
CGContextAddPath(context, transformedPath);
CGPathRelease(transformedPath);

这将填充和描边相同(缩放)的区域,但变换不会影响描边宽度。

顺便说一句。您通常会使用边界,而不是框架的大小来计算比例。

【讨论】:

以上是关于使用 CGContextScaleCTM 时避免拉伸笔画的主要内容,如果未能解决你的问题,请参考以下文章

将视网膜图像转换为视频:“CGContextScaleCTM:无效上下文 0x0。这是一个严重错误。”

数组,避免拉取 Duplicates,简单代码,C++

热拉怎么设置管理

源码解读:semi join 如何避免拉取大表数据?

微信H5单页面滑动的时候如何避免出界,出现头部和底部的黑底?

jQuery封装函数