我有一个班级,它是UIView的子班.我可以通过实现drawRect方法或实现drawLayer:inContext:(CALayer的委托方法)在视图中绘制内容.

我有两个问题:

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

    [[self layer] setDelegate:self];

    如果我的实例没有定义为层的委托,为什么会调用委托方法呢?如果调用drawLayer:inContext:,什么机制可以防止调用drawRect

推荐答案

如何决定使用哪种方法?每一个都有用例吗?

始终使用drawRect:,并且永远不要使用UIView作为任何CALayer的绘图代理.

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

UIView个实例都是其背景CALayer的绘图代理.这就是[[self layer] setDelegate:self];似乎什么都没做的原因.这是多余的.drawRect:方法实际上是视图图层的图形代理方法.在内部,UIView实现drawLayer:inContext:,在这里它自己做一些事情,然后调用drawRect:.您可以在调试器中看到它:

DrawRect:Stacktrace

这就是为什么在实现drawLayer:inContext:时从不调用drawRect:的原因.这也是为什么永远不应该在自定义的UIView子类中实现CALayer个绘制委托方法中的任何一个的原因.您也不应该使任何视图成为另一个图层的绘图代理.那会造成各种各样的危险.

如果您因为需要访问CGContextRef而实现drawLayer:inContext:,您可以通过呼叫UIGraphicsGetCurrentContext()drawRect:内部获取.

Ios相关问答推荐

Swift addtarget方法的默认参数不生效

我想在expo 中使用useSafeAreaInsets来获取paddingbottom,但我得到了一个错误

在将Cocoapods更新到1.13.0之后,它抛出错误

无法在 CollectionView 中禁用部分弹跳 - 组合布局

在 SwiftUI 中,绑定应该放在 ViewModel 中吗?

xcode-select:找不到clang

如何在swiftui中更改可搜索的搜索图标 colored颜色

一个 SwiftUI 视图中的多个垂直滚动视图

SwiftUI 文本字段代理绑定代码忽略空格不起作用?

Xcode 14 弃用了位码 - 但为什么呢?

搜索在 ios xamarin.forms 中不起作用

将flutter android项目导入iOS

UITableView 页脚,停止浮动内容

如何在 iOS 的 xib 中设置十六进制 colored颜色 代码

使用未知类型创建图像格式是一个错误与 UIImagePickerController

什么是伞头?

文件是为存档而构建的,它不是被链接的体系 struct (i386)

如何在ios中生成UUID

iOS应用程序每隔一次启动就会崩溃,找不到错误

具有两种不同字体大小的 NSAttributedString 示例?