使用 CALayer 委托

2024-03-06

我有一个 UIView,其图层将有子图层。我想为每个子图层分配委托,因此委托方法可以告诉图层要绘制什么。我的问题是:

作为 CALayer 的代表我应该提供什么?文档说不要使用图层所在的 UIView,因为这是为视图的主 CALayer 保留的。但是,创建另一个类只是作为我创建的 CALayers 的代表,这违背了不子类化 CALayer 的目的。人们通常使用什么作为 CALayer 的委托?或者我应该只是子类化?

另外,为什么实现委托方法的类不必遵守某种 CALayer 协议?这是一个更广泛的总体问题,我不太明白。我认为所有需要实现委托方法的类都需要实现者遵守的协议规范。


我更愿意将层委托方法保留在 UIView 子类中,因此我使用基本的重新委托委托类。该类无需自定义即可重用,从而无需子类化 CALayer 或仅为图层绘制创建单独的委托类。

@interface LayerDelegate : NSObject
- (id)initWithView:(UIView *)view;
@end

通过这个实现:

@interface LayerDelegate ()
@property (nonatomic, weak) UIView *view;
@end

@implementation LayerDelegate

- (id)initWithView:(UIView *)view {
    self = [super init];
    if (self != nil) {
        _view = view;
    }
    return self;
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context {
    NSString *methodName = [NSString stringWithFormat:@"draw%@Layer:inContext:", layer.name];
    SEL selector = NSSelectorFromString(methodName);
    if ([self.view respondsToSelector:selector] == NO) {
        selector = @selector(drawLayer:inContext:);
    }

    void (*drawLayer)(UIView *, SEL, CALayer *, CGContextRef) = (__typeof__(drawLayer))objc_msgSend;
    drawLayer(self.view, selector, layer, context);
}

@end

图层名称用于允许每层自定义绘制方法。例如,如果您已为图层指定了名称,例如layer.name = @"Background";,那么你可以实现这样的方法:

- (void)drawBackgroundLayer:(CALayer *)layer inContext:(CGContextRef)context;

请注意,您的视图将需要对该类的实例进行强引用,并且它可以用作任意数量层的委托。

layerDelegate = [[LayerDelegate alloc] initWithView:self];
layer1.delegate = layerDelegate;
layer2.delegate = layerDelegate;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CALayer 委托 的相关文章

  • CALayerframe.size不等于bounds.size

    我在CALayer上遇到了一些奇怪的事情 最后发现CALayer的frame size不等于它的bounds size 这是我无法理解的 我知道frame是在super的坐标系中 bounds是它自己的坐标 并且通常的情况是frame or
  • 使用 facebook connect for iPhone 上传照片的记录流程

    看完之后 我确实在 Facebook 论坛上看到了这篇文章 link http forum developers facebook com viewtopic php id 30467 他们正在向 facebook 对象提供 UIImage
  • 从核心数据存储创建 .sqlite 文件?

    我在书籍和提供 sqlite 文件下载的网站上看到过教程 sqlite 文件用于核心数据 如何获取 sqlite 文件FROM应用程序或核心数据存储TO我的桌面 如果您要创建一个预填充的 sqlite 文件以与 Core Data 一起使用
  • 如何使用编译时间作为自动版本控制信息?

    当程序被编译以获得一种自动版本信息时 是否有任何常量或 pragma来获取时间和日期 DATE and TIME 是预定义的宏 将分别扩展到当前日期和时间
  • Xcode 找不到我的静态库!

    这是链接器错误 i686 apple darwin10 gcc 4 2 1 Users william Documents SettingsLibrary build Debug iphonesimulator libSettingsLib
  • iPhone CGContext:用两种不同颜色绘制两条线

    我在 iPhone 应用程序中使用 CGContext 时遇到一些问题 我试图用不同的颜色绘制几条线 但所有线最终总是具有最后使用的颜色 我尝试了几种方法 但并不幸运 我建立了一个小型示例项目来处理这个问题 这是我的代码 我在drawRec
  • 如何让 UITableview 在重新加载时转到页面顶部?

    当我调用以下命令时重新加载表数据时 我试图让 UITableview 转到页面顶部 void pickerView UIPickerView pickerView didSelectRow NSInteger row inComponent
  • iPhone:隐藏搜索栏中的空格键

    我又要显得傻了 但这总比发疯好 这是我的问题 我有一个 UISearchBar 其中有一个我想隐藏的scopeBar 我这样做 searchBar showsScopeBar NO 我也打电话给 searchBar becomeFirstR
  • 从 iPhone 设备查找当前国家/地区

    我必须在 iPhone 设置中获取当前国家 地区 谁能告诉我如何在 iPhone 应用程序中获取当前国家 地区 我必须使用当前国家 地区来解析需要传递当前国家 地区的 RSS 提要 请帮我找到那个国家 提前致谢 要查找用户选择的语言所在的国
  • iPhone表情插入MySQL却变成空值

    我们正在开发一个 iPhone 应用程序 它将表情符号从 iPhone 发送到服务器端 PHP 并插入到 MySQL 表中 我正在做服务器端的工作 但是insert语句执行成功后 插入的值变成空了 我可以正确插入字段 varchar 的是文
  • 永远不会在 ios 的 google API 中获取上传数据进度

    我在我的应用程序中使用 Google Drive API 从我的应用程序上传文件 到目前为止 我成功了 并找到了上传所有类型文件的良好结果 我跟着谷歌示例 https developers google com drive examples
  • iPhone SDK:将 UIActivityIndi​​catorView 添加到 UITableViewCell

    为什么单元格在这段代码中没有显示任何内容 UIActivityIndicatorView spinner UIActivityIndicatorView alloc initWithActivityIndicatorStyle UIActi
  • 基于 JavaScript 的 iPhone UI 框架

    我们有一个基于推送的网络应用程序 最近 我们计划为其制作一个 iPhone 应用程序 就像 Facebook 拥有 iPhone 应用程序和网站一样 我们正在寻找一个可以让我们快速前进的 UI 框架 我翻阅过PhoneGap http ww
  • 如何从 UILabel 创建图像?

    我目前正在 iPhone 上开发一个简单的类似 Photoshop 的应用程序 当我想要展平图层时 标签位于良好的位置 但字体大小不佳 这是我要展平的代码 UIGraphicsBeginImageContext CGSizeMake wid
  • TableView 中图像的大小不正确

    我正在使用来自 URL 的图像创建一个表视图 但图像不会调整到所有视图的大小 直到我将其按入行中 知道为什么会发生这种情况吗 这是一个自定义的表格视图 我的代码是 UITableViewCell tableView UITableView
  • 如何设置仅适用于 iPhone 或 iPad 的视口?

    我有一个网站 需要在 iphone 上使用 0 3 的视口值 但在 ipad 上使用 0 7 有没有办法只为 iPhone 或 iPad 设置视口 这是一种解决方案
  • 防止点击 MKAnnotation 时检测到 MKMapView 上的触摸事件

    我有一个 UITapGestureRecognizer 当用户点击地图时 它将在我的 MKMap 上隐藏和显示工具栏 简单 但是 当用户点击 MKMapAnnotation 时 我不希望地图以正常方式响应点击 如上所述 此外 当用户点击地图
  • iOS 7 导航栏颜色在 iPhone 4 上无法正确显示

    我的导航栏颜色在 iOS 7 中正常显示 部署iOS 6 0 但如果系统版本是iOS 7 0或更高版本 部分导航栏颜色在iPhone 4上无法正常显示 在iPhone 5上工作正常 我是这样做的 if SYSTEM VERSION GREA
  • CMSampleBufferSetDataBufferFromAudioBufferList 返回错误 12731

    我正在尝试捕获应用程序声音并将其传递给 AVAssetWriter 作为输入 我正在设置音频单元的回调以获取 AudioBufferList 问题始于将 AudioBufferList 转换为 CMSampleBufferRef 它总是返回
  • 我如何从 iPhone 设备获取电子邮件历史记录..?

    friends 我想从我的 iPhone 访问电子邮件历史记录 并且还希望在收到新邮件时收到通知 如果可能的话 请向我提供源代码片段 Thanks 简而言之 使用任何已记录的 API 都是不可能的

随机推荐

  • 为什么我们必须为 @SuppressWarnings("unchecked") 使用中间变量?

    大家下午好 我想知道是什么原因 public class test
  • Win32中RedrawWindow和UpdateWindow有什么区别?

    Win32中RedrawWindow和UpdateWindow有什么区别 既然它们似乎有相同的目的来刷新窗口 那么有什么区别呢 RedrawWindow通常用于立即强制重绘整个窗口 或其中的某些指定区域 UpdateWindow将强制仅重绘
  • 有什么办法可以加快实体框架中的 CreateIfNotExists 速度?

    我在 SQL Server 2008 上使用 EF 4 3 Code First 我运行了几个测试套件 这些测试套件使用 CreateIfNotExists 删除并重新创建数据库 这工作正常 但速度很慢 第一次调用时创建数据库最多可能需要
  • only_full_group_by模式有什么好处?

    我更新了mysql 从MySQL版本5 6 17升级到版本5 7 14 因为我的 sql 查询有错误 事实上 我的许多查询都是这样的 SELECT count id as nbr lic from prep WHERE key 18 我有这
  • C# 清除具有值类型的 List 仍然是 O(n) 操作吗?

    据微软称文档 https msdn microsoft com en us library dwb5h52a 28v vs 110 29 aspx 在 List 上调用 Clear 是一个 O n 操作 我猜这是因为如果列表要保存引用 则需
  • Flutter - 在一个屏幕上显示两个ListView

    我正在尝试添加水平线listView builder在另一个垂直的顶部listView builder Both listViews应该有text在两者之上 这是我到目前为止所做的仅顶部水平 listView builder is draw
  • django HttpResponse 和 unicode

    我使用 django 作为网络应用程序的后端 我通过 django 发送 json 数据 效果很好 然而最近我开始处理非 ASCII 数据并注意到非 ASCII 字符的一些异常行为 在我的网络应用程序中 我的代码如下所示 def make
  • 进行立即变量赋值

    我在使用 与使用 分配的变量相结合的 make 文件中立即分配变量时遇到问题 例如 VAR a VARS VAR rule1 echo VARS VAR b VARS VAR rule2 echo VARS 当我运行 make 时 无论规则
  • 动态类定义的酸洗

    我正在尝试将动态生成的类作为替代类的工厂 像下面这样 import sys pickle class BC object pass C type NewClassName BC pickle dump C sys stdout 这会导致以下
  • 谷歌地图 V3 JS 没有发生 UIWebView iOS 6(iPhone) 的“中心更改”

    我正在尝试显示GoogleMap Google maps V3 JS in UIWebView ios6 but 当我在网络视图中移动地图时 事件没有发生center changed 移动地图已完成 事件火 Why 有人告诉我页面 http
  • PHP使用时区函数的时差?

    我试图找到一种方法来使用 PHP 中的时区函数显示两个位置之间的时间差异 http php net manual en timezones php http php net manual en timezones php 假设我从上面的链接
  • Excel VBA - 运行时错误“9”,下标超出范围

    我真的很感谢我能得到的任何帮助 我试图循环遍历一列 查找重复的名称 然后从同一行获取该名称和其他几个数据 并将它们放入一个我想使用另一个函数的二维数组中 但它不起作用 我真的需要你的帮助来弄清楚为什么我不能在不保留数据的情况下重新调整这个数
  • Web 音频 API - 如何将音频缓冲区保存到包含所有更改的文件?

    我对音频缓冲区 例如增益和平移 进行了更改 并将它们连接到音频上下文 现在我想将所有已实施的更改保存到一个文件中 按原样保存缓冲区将为我提供未经更改的原始音频 有任何方法或程序可以做到这一点吗 方法是使用MediaRecorder保存修改后
  • java中继承私有字段

    如果子类不能从超类继承私有成员 但它从超类继承公共方法 这些方法可以访问未继承的私有成员 如此处所述 http docs oracle com javase tutorial java IandI subclasses html http
  • 无法找到 Microsoft 认知服务的订阅密钥

    I need to work on Microsoft Cognitive Services Face API I downloaded the code from https github com Microsoft Cognitive
  • CLARION 日期转换 C# + 日期加/减

    这是针对 ISV 数据库的 所以我对此进行了逆向工程并且无法更改 我如何在 C 中执行以下日期到 int visa versa 转换 所以说日期是 5 17 2012 它被转换为 int 77207 在数据库中 起初我以为这是儒略日期 但事
  • => 和 () => 在 Scala 中意味着什么[重复]

    这个问题在这里已经有答案了 我是 Scala 的新手 我真的很喜欢它 但有时它会让我感到惊讶 例如 clickedCallbacks List gt Unit 谁能告诉我什么 gt and gt 在斯卡拉中是什么意思 gt 是用于创建函数实
  • C# 和 SQL Server 中 int 到 guid 的不同转换

    在 C 和 SQL Server 中将 int 转换为 guid 时 我得到不同的值 在C 中我使用这个方法 public static Guid Int2Guid int value byte bytes new byte 16 BitC
  • Ant 无法删除 Windows 上的某些文件

    我有一个 ant 构建 可以创建目录 调用 javac 和所有常规内容 我遇到的问题是 当我尝试执行清理 删除生成的所有内容 时 删除任务报告无法删除某些文件 当我尝试手动删除它们时 效果很好 这些文件显然没有被任何其他进程打开 但 ant
  • 使用 CALayer 委托

    我有一个 UIView 其图层将有子图层 我想为每个子图层分配委托 因此委托方法可以告诉图层要绘制什么 我的问题是 作为 CALayer 的代表我应该提供什么 文档说不要使用图层所在的 UIView 因为这是为视图的主 CALayer 保留