gpt4 book ai didi

iphone - iOS:使用 UIView 的 'drawRect:' 与其层的委托(delegate) 'drawLayer:inContext:'

转载 作者:IT王子 更新时间:2023-10-29 07:32:09 25 4
gpt4 key购买 nike

我有一个类是 UIView 的子类。我可以通过实现 drawRect 方法或通过实现 drawLayer:inContext: 来在 View 中绘制东西,这是 CALayer 的委托(delegate)方法>。

我有两个问题:

  1. 如何决定使用哪种方法?每个都有用例吗?
  2. 如果我实现 drawLayer:inContext:,它会被调用(而 drawRect 不会,至少就放置断点而言是这样),即使我没有使用以下方式将我的 View 分配为 CALayer 委托(delegate):

    [[自层] setDelegate:self];

    如果我的实例没有被定义为层的委托(delegate),怎么会调用委托(delegate)方法呢?如果调用 drawLayer:inContext:,什么机制会阻止调用 drawRect

最佳答案

How to decide which approach to use? Is there a use case for each one?

始终使用drawRect:,永远不要使用UIView 作为任何CALayer 的绘图委托(delegate)。

how come the delegate method is called if my instance is not defined to be the layer's delegate? and what mechanism prevents drawRect from being called if drawLayer:inContext: is called?

每个 UIView 实例都是其支持 CALayer 的绘图委托(delegate)。这就是为什么 [[self layer] setDelegate:self]; 似乎什么都不做。这是多余的。 drawRect: 方法实际上是 View 层的绘图委托(delegate)方法。在内部,UIView 实现了 drawLayer:inContext:,它在其中执行一些自己的操作,然后调用 drawRect:。你可以在调试器中看到它:

drawRect: stacktrace

这就是为什么在您实现 drawLayer:inContext: 时从未调用过 drawRect:。这也是为什么您不应该在自定义 UIView 子类中实现任何 CALayer 绘图委托(delegate)方法的原因。您也不应该让任何 View 成为另一层的绘图委托(delegate)。这会导致各种古怪。

如果您正在实现 drawLayer:inContext: 因为您需要访问 CGContextRef,您可以从 drawRect: 中获取它通过调用 UIGraphicsGetCurrentContext()

关于iphone - iOS:使用 UIView 的 'drawRect:' 与其层的委托(delegate) 'drawLayer:inContext:',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4979192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com