我一直在到处寻找答案。我还在学习iOS开发的速度,所以我可以肯定地接受我在这里可能是无关紧要的。然而,答案的完全和彻底的缺乏让我怀疑是否真的有答案。
事情是这样的:我使用一个CGLayer来生成一个相当基本的矢量多边形:
- (CGLayerRef)getASegment
{
CGSize layerSize = s_viewRects[kASegment].size;
CGLayerRef theLayer = CGLayerCreateWithContext ( UIGraphicsGetCurrentContext(),
layerSize, nil );
CGContextRef context = CGLayerGetContext ( theLayer );
CGContextAddLines ( context, s_shapePoints, 7 );
return theLayer;
}s_viewRects是一个静态数组,它保存容器矩形,就像放置在整体图像中一样,s_shapePoints包含一个CGPoint结构数组,它映射出一个扭曲的六边形。
现在,我想重新使用这个形状。它需要翻转和旋转,以适应所有的用途(为了记录,这些都是"LED“显示器中的”段“)。
我得到的形状很好。没问题。
问题在于旋转它以供重复使用。似乎没有任何方法可以真正旋转CGLayer。有很多方法可以旋转CALayers,但不能旋转CGLayers。我很乐意使用CALayer,除了CALayers似乎都专注于光栅图形,而且我需要矢量图形。
我相信肯定有一个显而易见的方法来解决这个问题。到目前为止,我看到的唯一方法是旋转整个目标图形上下文,绘制形状,然后取消旋转上下文。相当于转动房间拧下灯泡的螺丝。
我能让它工作的唯一方法是在单独绘制每个线段之前实际转换这些点,这意味着没有重复使用。在形状创建期间执行CGContextRotateCTM实际上并不会在显示时产生旋转的元素。
有什么线索吗?
发布于 2012-07-02 21:37:41
到目前为止,我看到的唯一方法是旋转整个目标图形上下文,绘制形状,然后取消旋转上下文。相当于转动房间拧下灯泡的螺丝。
我很确定这就是你的解决方案。这就是CGContextRef绘图的工作原理。
我很乐意使用CALayer,除了CALayers似乎都专注于光栅图形,而我需要矢量图形。
您是否尝试过使用CAShapeLayer
发布于 2012-07-04 20:58:59
好的,正如所承诺的,这是代码。
首先,我使用一个CAShapeLayer,并以类似于上面的方式创建它:
- (CALayer *)getSegment
{
CGRect layerFrame = CGRectMake ( 0, 0, s_viewRects[kASegment].size.width, s_viewRects[kASegment].size.height );
CAShapeLayer *ret = [CAShapeLayer layer];
[ret setFrame:layerFrame];
CGMutablePathRef thePath = CGPathCreateMutable ();
CGPathAddLines ( thePath, nil, s_shapePoints, 7 );
[ret setPath:thePath];
return ret;
}然后,我将其设置为一个主层,就像这样,在此过程中进行转换:
_top_left_element = [self getSegment];
frame = [self calculateRectForElement:_top_left_element];
CATransform3D transform = CATransform3DIdentity;
transform = CATransform3DRotate(transform, M_PI_2, 0.0, 0.0, -1.0 );
[_top_left_element setTransform:transform];
[_top_left_element setFrame:frame];
[_main_element addSublayer:_top_left_element];CATransform3DRotate是必需的,因为层的transform属性是3D属性。我使用M_PI_2,因为所有的变换都是以弧度为单位的(M_PI_2是一个方便的宏,意思是"90°"),-1将使旋转方向逆时针。
calculateRectForElement是一个函数,它可以找出所有东西的位置。它只是返回一个定位元素的rect。
_top_left_element是一个类属性,它是CALayer*。
是我干的,比约恩·斯特朗因瑟兰是你叔叔。
UPDATE:我想补充的是,你需要确保你在卸载/析构中CGPathRelease层的路径,否则你会得到一个泄漏。
https://stackoverflow.com/questions/11293119
复制相似问题