通过renderInContext定位用于绘制的View:

问题描述 投票:0回答:2

我想在我当前的

UIView
中画一个
CGGraphicsContext
。我通过
UIView
绘制
renderInContext:
,但它的位置不正确(始终位于左上角)。

我有

UIView
的所有值,可用于绘制
UIView

CGRect frame;
CGRect bound;
CGPoint center;
CGAffineTransform transform;

我目前设置图层的位置和旋转如下:

CGContextTranslateCTM(context, frame.origin.x, frame.origin.y);
CGContextRotateCTM(context, (CGFloat) atan2(transform.b, transform.a));

但是由于旋转,位置不正确并且与原始位置不同。
怎样才能恢复原来的位置呢?坐标系在这期间没有改变,只是将

center.x
center.y
值转换为适合
CGContextTranslateCTM
的值。

编辑:
保存的值是正确的,保存正确的

bounds
center
transform
不是我的问题的根源,我的问题的根源是通过
CGLayer
将这些值设置为可绘制的
CGContextTranslateCTM

ios core-graphics calayer cgcontext
2个回答
10
投票

图形上下文的几何形状可以通过以下代码片段调整为

UIView
的几何形状:

// Center the context around the view's anchor point
CGContextTranslateCTM(context, [view center].x, [view center].y);
// Apply the view's transform about the anchor point
CGContextConcatCTM(context, [view transform]);
// Offset by the portion of the bounds left of and above the anchor point
CGContextTranslateCTM(context,
                      -[view bounds].size.width * [[view layer] anchorPoint].x,
                      -[view bounds].size.height * [[view layer] anchorPoint].y);

0
投票

创建一个大小与 CGContext 大小匹配的新图层,将 view.layer 作为子图层添加到新创建的图层中,然后相应地定位 view.layer。

CGContextRef context = CGBitmapContextCreate(NULL,
                                             1000.f,
                                             1000.f,
                                             16,
                                             20480,
                                             colorSpace,
                                             4353);

CALayer *copiedLayer = [view.layer copy];
CALayer *parentLayer = [CALayer new];

parentLayer.bounds = CGRectMake(0.f,
                                0.f,
                                CGBitmapContextGetWidth(context),
                                CGBitmapContextGetHeight(context));

copiedLayer.frame = view.frame;

[parentLayer addSublayer:copiedLayer];
[parentLayer renderInContext:context];
© www.soinside.com 2019 - 2024. All rights reserved.