【问题标题】:CALayers never calls it's delegate's drawLayer:inContext: even after [layer setNeedsDisplay] and [layer display]CALayers 从不称其为委托的 drawLayer:inContext: 即使在 [layer setNeedsDisplay] 和 [layer display] 之后
【发布时间】:2013-04-05 23:45:54
【问题描述】:

我不明白为什么我正在创建的 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;
}

在 self.drawer 我有:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    NSLog(@"layer called drawLayer");
    // Some drawing goes here
}

我尝试了很多不同的方法。我尝试在 self.bg.layer 上设置 setNeedsDisplay,我在 self.bg 上尝试过 setNeedsDisplay,我在 addSublayer 之前和之后尝试过 [layer setNeedsDisplay],我在 addSublayer 之前和之后尝试过 [layer display]。我尝试过使用和不使用 [layer display] 和 [layer displayIfNeeded]。

为什么图层拒绝绘制?

【问题讨论】:

    标签: ios objective-c core-animation core-graphics calayer


    【解决方案1】:

    你有没有在你的 Layer 的委托中实现这个方法?如果是,将调用您的图层委托的此方法。

    - (void)displayLayer:(CALayer *)layer
    

    如果您阅读 Apple 的 setNeedsDisplay 文档,它会清楚地说明

    Calling this results in the layer potentially calling either the displayLayer: or drawLayer:inContext: method of its delegate.
    

    如果您不想直接设置图层的内容,而是想绘制图层的内容,则不应实现 displayLayer。然后,您可以在 drawLayer:inContext: 方法中进行绘图,而该方法应该被调用。

    【讨论】:

    • 我不知道那种方法。我把它放在我的委托中,它确实被调用了。 drawLayer 仍然没有被调用。我应该从 displayLayer 手动调用它吗?
    • 没有定义 displayLayer 方法并不能解决问题。但我想通了。见我上面的回答。
    【解决方案2】:

    图层框架需要非零。这解决了问题:

    layer.frame = self.bg.bounds;
    [layer setNeedsDisplay];
    [self.bg.layer addSublayer:layer];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 2022-07-20
      • 2020-12-13
      相关资源
      最近更新 更多