zak*_*ces 9 core-animation core-graphics objective-c calayer ios
我无法弄清楚为什么我正在创建的CALayer没有调用他们的drawLayer方法.我为它们创建了一个drawLayer委托对象,但它永远不会被调用.从UIView子类:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
UIView *bg = [[UIView alloc] initWithFrame:self.bounds];
// I have a property called 'bg' to reference the child UIView
self.bg = bg;
[self addSubview:self.bg];
// an NSObject subclass I use as a CALayer delegate
MyLayerDelegate *drawer = [MyLayerDelegate new];
self.drawer = drawer;
CAGradientLayer *layer = [CAGradientLayer layer];;
layer.delegate = self.drawer;
layer.name = @"bg";
[self.bg.layer addSublayer:layer];
[layer setNeedsDisplay];
[layer display];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
在self.drawer我有:
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
NSLog(@"layer called drawLayer");
// Some drawing goes here
}
Run Code Online (Sandbox Code Playgroud)
我尝试了很多不同的东西.我已经尝试在self.bg.layer上设置setNeedsDisplay,我在self.bg上尝试了setNeedsDisplay,我在addSublayer之前和之后尝试了[layer setNeedsDisplay],我在addSublayer之前和之后尝试了[图层显示].我曾尝试使用和不使用[图层显示]和[图层displayIfNeeded].
为什么图层拒绝绘制?
zak*_*ces 10
图层框架必须为非零.这解决了这个问题:
layer.frame = self.bg.bounds;
[layer setNeedsDisplay];
[self.bg.layer addSublayer:layer];
Run Code Online (Sandbox Code Playgroud)
您是否在 Layer 的委托中实现了此方法?如果是,将调用层委托的此方法。
- (void)displayLayer:(CALayer *)layer
Run Code Online (Sandbox Code Playgroud)
如果您阅读 Apple 的 setNeedsDisplay 文档,它清楚地表明
Calling this results in the layer potentially calling either the displayLayer: or drawLayer:inContext: method of its delegate.
Run Code Online (Sandbox Code Playgroud)
如果您不想直接设置图层的内容而是想绘制图层的内容,则不应实现 displayLayer。然后,您可以在应该调用的drawLayer:inContext:方法中进行绘图。
| 归档时间: |
|
| 查看次数: |
6073 次 |
| 最近记录: |