当子类化 CALayer 并实现 drawInContext 方法时,我会假设我在其中所做的任何绘图都会显示出来,但是如果我设置(例如)borderWidth/borderColor,那么 CALayer 将在其上绘制边框首先拥有我的自定义绘图代码。
这是 CALayer 子类:
@implementation MyCustomCALayer
<pre><code>- (id)init
{
self = [super init];
if(self)
{
[self setNeedsDisplayOnBoundsChange:YES];
}
return self;
}
- (void)drawInContext:(CGContextRef)context
{
CGRect rect = CGContextGetClipBoundingBox(context);
CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
CGContextFillRect(context, rect);
}
@end
</code></pre>
在 UIView 中创建,例如:
- (void)ensureLayer<br/>
{<br/>
if(myLayer)<br/>
return;
<pre><code> myLayer = [[[MyCustomCALayer alloc] init] autorelease];
myLayer.borderColor = [UIColor greenColor].CGColor;
myLayer.borderWidth = 1;
myLayer.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
}
- (void)layoutSublayersOfLayer:(CALayer *)layer
{
[super layoutSublayersOfLayer:layer];
[self ensureLayer];
if(![[layer.sublayers objectAtIndex:0] isEqual:myLayer])
[layer insertSublayer:myLayer atIndex:0];
}
</code></pre>
发生的情况是,MyCustomCALayer 用红色填充一个矩形,这是我期望看到的,没有其他内容,因为我已经实现了 drawInContext 方法,但我看到的是一个顶部有绿色边框的红色矩形,总是在最上面,我已经尝试了几乎所有我能想到的组合来摆脱正在绘制的绿色边框,但无法弄清楚。
我的理由是我想使用 CALayer 的 borderWidth 和 borderColor 以及其他属性,而不是创建自己的属性,因为我需要绘制的代码包含边框、填充等...但是渲染我要做的不是简单的造型。因此,我发现解决此问题的唯一方法是将 borderWidth 设置为 0 并将我自己的属性添加到我的子类中,例如 myBorderWidth,这很荒谬。
这是使用最新的 iOS SDK 完成的,但我想 Mac 上也是一样的。
希望这是有道理的,有什么想法吗?
谢谢!
最佳答案
你运气不好; CoreAnimation 不支持覆盖其基本图层属性的渲染实现。请做file a bug .
关于objective-c - CALayer - 清晰的内部渲染上下文有利于自定义绘图代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5437878/