图层中的 Alpha 检测在模拟器上正常,而不是在 iPhone 上

2023-12-05

首先,检查一下这个非常方便的扩展CALayer来自其他地方的SO。它可以帮助您确定图层内容中的点是否已分配CG图像参考是否透明。

注意:不能保证图层的contents具有代表性或回应,就好像它是一个CG图像参考。 (当然,这可能会对更广泛地使用上面引用的扩展产生影响。)但是,就我而言,我知道我正在测试的层具有contents被分配了一个CG图像参考。 (希望分配后这不会在我的领导下改变!另外我注意到contents被保留。)

好吧,回到手头的问题。这是我使用该扩展的方式。首先,我将选择器从containsPoint: to containsNonTransparentPoint:(我需要保留原来的方法。)

现在,我有一个UI图像视图使用七个的子类CALayer对象。这些用于基于不透明度的动画(脉冲/发光效果和开/关状态)。这七层中的每一层都有一个已知的CG图像参考 in its contents它用自己的颜色有效地“覆盖”(空气引号)整个视图的一部分。每个图像在其各自层中的其余部分是透明的。

在子类中,我注册了单击手势。当一个到达时,我遍历我的图层以查看哪个图层被有效点击(也就是说,哪个图层有一个我点击的不透明点,第一个找到的获胜),然后我可以做任何需要做的事情。

这是我处理手势的方式:

- (IBAction)handleSingleTap:(UIGestureRecognizer *)sender {
    CGPoint tapPoint = [sender locationInView:sender.view];

    // Flip y so 0,0 is at lower left. (Required by layer method below.)
    tapPoint.y = sender.view.bounds.size.height - tapPoint.y;

    // Figure out which layer was effectively tapped. First match wins.
    for (CALayer *layer in myLayers) {
        if ([layer containsNonTransparentPoint:tapPoint]) {
            NSLog(@"%@ tapped at (%.0f, %.0f)", layer.name, tapPoint.x, tapPoint.y);

            // We got our layer! Do something useful with it.
            return;
        }
    }
}

好消息?所有这些在运行 iOS 4.3.2 的 iPhone 模拟器上都能完美运行。 (FWIW,我在 Lion 上运行 Xcode 4.1。)

然而,在我的 iPhone 4(装有 iOS 4.3.3)上,它甚至还差得远!None我的水龙头似乎与any我期望它们的层数。

即使我尝试建议使用CGContext设置混合模式当绘制到 1x1 像素上下文中时,没有骰子。

我希望这是飞行员失误,但我还没有弄清楚差异是什么。水龙头确实有一种图案,但不可辨别。

也许存在数据边界问题。也许我必须做一些除了将 y 坐标翻转到图像左下角之外的事情。只是还不确定。

如果有人可以阐明可能存在的问题,我将不胜感激!

2011 年 9 月 22 日更新:第一个啊哈时刻获得了!问题不在于模拟器与 iPhone 的较量。 这是视网膜与非视网膜的对比!模拟器中也出现同样的症状 使用 Retina 版本时。也许解决方案以某种方式/形状/形式围绕缩放(CTM?)。 Quartz 2D 编程指南还建议“iOS 应用程序应该使用UIGraphicsBeginImageContextWithOptions” 我觉得我已经非常接近这里的解决方案了!


好的!首先,问题不在于模拟器与 iPhone 的较量。相反,这是视网膜与非视网膜的对比。使用 Retina 版本时,模拟器中也会出现相同的症状。人们立刻开始认为解决方案与扩展有关。

Apple Dev Quartz 2D 论坛上的一篇非常有用的帖子(沿着类似的“注意缩放”路线)引导我找到了解决方案。现在,我第一个承认,这个解决方案并不漂亮,但它确实适用于视网膜和非视网膜情况。

这样,这是上述的修改后的代码CAL层扩展:

//
// Checks image at a point (and at a particular scale factor) for transparency.
// Point must be with origin at lower-left.
//
BOOL ImagePointIsTransparent(CGImageRef image, CGFloat scale, CGPoint point) {
    unsigned char pixel[1] = {0};

    CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 1,
        NULL, kCGImageAlphaOnly);
    CGContextSetBlendMode(context, kCGBlendModeCopy);
    CGContextDrawImage(context, CGRectMake(-point.x, -point.y,
        CGImageGetWidth(image)/scale, CGImageGetHeight(image)/scale), image);

    CGContextRelease(context);
    CGFloat alpha = pixel[0]/255.0;
    return (alpha < 0.01);
}

@implementation CALayer (Extensions)

- (BOOL)containsNonTransparentPoint:(CGPoint)point scale:(CGFloat)scale {
    if (CGRectContainsPoint(self.bounds, point)) {
        if (!ImagePointIsTransparent((CGImageRef)self.contents, scale, point))
            return YES;
    }
    return NO;
}

@end

简而言之,我们需要了解规模。如果我们将图像宽度和高度除以该比例,那么命中测试现在可以在视网膜和非视网膜设备上运行!

我不喜欢的是我不得不把那个可怜的选择器弄得一团糟,现在称为包含非透明点:比例:。正如问题中提到的,永远无法保证图层的内容将包含什么。就我而言,我只在有 CGImageRef 的图层上使用它,但这在更通用/可重用的情况下不会起作用。

所有这些让我想知道 CALayer 是否不是这个特定扩展的最佳位置,至少在这个新版本中是这样。也许 CGImage 加上一些图层智能,会更干净。想象一下对 CGImage 进行命中测试,但返回当时具有非透明内容的第一层的名称。仍然存在不知道哪些层中有 CGImageRefs 的问题,因此可能需要一些提示。 (留给你自己和读者作为练习!)

UPDATE:在与 Apple 的开发人员进行一些讨论后,以这种方式搞乱层实际上是不明智的。与我之前学到的相反(错误?),封装在 UIView 中的多个 UIImageView 是这里的方法。 (我总是记得知道您希望将自己的观点保持在最低限度。也许在这种情况下,这没什么大不了的。)不过,我暂时将这个答案保留在这里,但不会将其标记为正确。一旦我尝试并验证了其他技术,我将在这里分享!

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

图层中的 Alpha 检测在模拟器上正常,而不是在 iPhone 上 的相关文章

  • 决策树和规则引擎 (Drools)

    In the application that I m working on right now I need to periodically check eligibility of tens of thousands of object
  • WCF 服务主机配置 - 请尝试将 HTTP 端口更改为 8732

    我的 PC 上运行着一个复杂的基于 WCF 服务的解决方案 但由于安装 Windows 8 1 时出现问题 我不得不 刷新 我的 PC 现在我已经重新安装了 Visual Studio 2012 我的项目不再正常运行 当我调试单元测试时 w
  • Spark scala 模拟 Spark.implicits 用于单元测试

    当尝试使用 Spark 和 Scala 简化单元测试时 我使用 scala test 和mockito scala 以及mockito Sugar 这只是让你做这样的事情 val sparkSessionMock mock SparkSes
  • mybatis:使用带有 XML 配置的映射器接口作为全局参数

    我喜欢使用 XML 表示法来指定全局参数 例如连接字符串 我也喜欢 Mapper 注释 当我尝试将两者结合起来时 我得到这个例外 https stackoverflow com questions 4263832 type interfac
  • 使用 Ruby aws-sdk 跟踪文件到 S3 的上传进度

    首先 我知道SO中有很多与此类似的问题 在过去的一周里 我读了大部分 如果不是全部 但我仍然无法让这项工作为我工作 我正在开发一个 Ruby on Rails 应用程序 允许用户将 mp3 文件上传到 Amazon S3 上传本身工作正常
  • 如何在连接到 Heroku PostgreSQL 的 Flask 应用程序上处理更多并发用户?

    Heroku 上的 Flask API 有许多端点 它们在将 json 化结果返回给客户端之前在我的 Heroku PostgreSQL 数据库上运行查询 我当前的计划是 Hobby Basic 层 因此数据库最多只能处理 20 个连接 如
  • Jquery 以编程方式更改

    文本

    编辑 解决方案是将其添加到个人资料页面而不是性别页面 profile live pageinit function event p pTest text localStorage getItem gender 我在列表视图中有一个带有一些文
  • 区分 NaN 输入和输入类型为“number”的空输入

    我想使用 type number 的表单输入 并且只允许输入数字
  • $ 在 JQuery 中意味着什么

    在下面的 var obj one 1 two 2 three 3 four 4 five 5 each obj function i val console log val 这里是什么意思 是对象吗 是一个别名jQuery对象 函数 它充当
  • 如何将 SQLite 数据库捆绑到 Go 二进制文件中?

    我尝试使用 go bindata 和 packr 但这些包没有显示如何将 SQLite 数据库文件打包到二进制文件中 我不需要以任何方式更新数据库 我只想在启动时从中读取数据 如何将 SQLite 数据库文件嵌入到 Go 二进制文件中 SQ
  • 使用溢出支持定位粘性填充材料[重复]

    这个问题在这里已经有答案了 我在用position sticky在我的应用程序中 在使用overflow属性来显示滚动条 我已经寻找了一个确实支持这种情况的polyfill 但到目前为止没有任何运气 有谁知道这样的polyfill shim
  • 如何禁用 solr 管理页面

    对于生产来说 拥有一个甚至不要求登录凭据的 solr 管理员感觉不安全 如何禁用默认的 solr 管理页面 我只是希望我的 web 应用程序使用 Solr 进行搜索词索引 我强烈建议保留管理页面用于调试目的 它在很多情况下拯救了我 有多种方
  • 进程被杀死后不会调用 onActivityResult

    我有一个主要活动 Main 和另一个活动 Sub 由 Main 调用 startActivityForResult new Intent this SubActivity class 25 当我在 Sub 时 我终止该进程 使用任务管理器或
  • 水平和垂直居中 div 位于页面中间,页眉和页脚粘在页面顶部和底部

    我正在尝试制作一个具有固定高度页眉和页脚的页面 页眉位于屏幕顶部 100 宽度 页脚位于底部 100 宽度 我想将一个具有可变高度内容的 div 居中放置在页眉和页脚之间的空间中 在下面的 jsfiddle 中 如果内容比空格短 它会起作用
  • Rails - 渲染:目标锚标记的操作?

    我希望像这样使用渲染 render action gt page form 我也尝试过这个 render template gt site page form 那也没用 这个特定页面上的表单位于最底部 如果提交时发生任何错误 我不希望用户被
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe
  • 使用 paramiko 运行 Sudo 命令

    我正在尝试执行sudo使用 python paramiko 在远程计算机上运行命令 我尝试了这段代码 import paramiko ssh paramiko SSHClient ssh set missing host key polic
  • 对象指针值作为字典的键

    我想使用对象的引用值作为字典的键 而不是对象值的副本 因此 我本质上想在字典中存储与另一个对象的特定实例关联的对象 并稍后检索该值 这可能吗 是不是完全违背了NSDictionary的理念 我可以看出我可能以错误的方式处理这个问题 因为字典
  • 为什么 try catch 块没有捕获 Promise 异常?

    我对承诺的错误处理感到困惑 答案可能很明显 但我不明白 我有以下示例代码 var test async function throw new Error Just another error try test then catch err
  • HTML 表格 - 固定列宽和多个可变列宽

    我必须建立一个有 5 列的表 表格宽度是可变的 内容宽度的 50 有些列包含固定大小的按钮 因此这些列应该有一个固定大小 例如 100px 有些列中有文本 所以我希望这些列具有可变的列宽 例如 Column1 tablewidth sum

随机推荐

  • CFBundleDocumentTypes 和 UIFileSharingEnabled 问题

    有人让 UIFileSharingEnabled 或 CFBundleDocumentTypes 工作吗 我将 UIFileSharingEnabled 添加为 true 到我的 plist 中 并使用下面链接中的 Apple 示例作为 C
  • 在 iOS 14 小部件上渲染图像

    我正在开发 iOS 14 Widget 扩展 我有 3 个图像要循环显示 并创建一个时间轴来显示这些图像 func getTimeline in context Context completion escaping Timeline
  • 单行上的 EditText.setError()

    我有一个问题EditText setError 我有一个 EditText
  • 在 boost r-tree 中存储或访问对象

    我在用Boost s我的代码中的 r 树实现 我有一个带有坐标的对象列表 比如地图上的城市 如果重要的话 我希望在 r 树中索引 以执行快速 NN 搜索等 我已经遵循了他们的迭代查询示例 其中树木存储boost geometry model
  • C# 按值传递

    我只是想举下面的例子 public void main int x 1 Foo x public void Foo int y y 5 我们知道 C 参数是按值类型的值传递的 这是否意味着在上面的示例中 我在堆栈上有 2 个副本 一份用于
  • Z3 中断言的顺序有何重要性?

    我有两个文件 除了放置断言的顺序之外 其内容相同 在一个文件中 断言的放置顺序与另一个文件的顺序相反 第一个文件 po 9 z3 在不到一秒的时间内被 Z3 声明为不可满足 而另一个文件 po z3 在一分钟内无法验证 造成这种差异的原因是
  • 如何获取 XCode 应用程序的日志

    我正在寻找 Xcode 应用程序本身的日志 不是我的 iOS 应用程序或设备的日志 我一直在使用 Storyboard 源代码 xml 进行一些实验工作 有时我会收到 Xcode 随机崩溃或类似 无法打开文档 Main storyboard
  • 使用 Process.Start 运行程序时,找不到其资源文件

    我有这个代码 private void button1 Click object sender EventArgs e Process p new Process p StartInfo FileName C Users Valy Desk
  • 在多个 cpp 文件上使用类/结构/联合 C++

    我正在尝试在 C 中创建一个类 并且能够在多个 C 文件中访问该类的元素 我已经尝试了 7 种以上可能的方案来解决该错误 但均未成功 我研究过类前向声明 这似乎不是答案 我可能是错的 resources h class Jam public
  • 设置 NSDateComponents 会导致 NSDate 不正确

    我正在尝试获取当地时间为 21 00 的 NSDate 对象 不关心是哪一天 我对这个非常奇怪的结果感到摸不着头脑 NSCalendar calendar NSCalendar alloc initWithCalendarIdentifie
  • Cron 不运行 django 命令

    我有一个 django 脚本 应该每天在指定时间运行 我正在尝试使用以下方法来实现此目的crontab 该脚本应该转储数据库 并使用gzip并将其上传到bitbucket 以下是我的相关部分crontab file 00 4 root py
  • 如何对 SciPy 曲线拟合施加约束?

    我正在尝试使用自定义概率密度函数来拟合一些实验值的分布 显然 结果函数的积分应始终等于 1 但简单的 scipy optimize curve fit function dataBincenters dataCounts 的结果永远不会满足
  • 在 PHP 中,当向数据库提交字符串时,我应该使用 htmlspecialchars() 处理非法字符还是使用正则表达式?

    我正在开发一个表单 用户可以在要提交给数据库的字符串中使用非法 特殊字符 我想转义 否定字符串中的这些字符并一直在使用htmlspecialchars 但是 有更好 更快的方法吗 数据库中没有 非法 字符 不能存储某些字符的数据库是无稽之谈
  • Android Studio 项目的 .gitignore 中应该包含哪些内容?

    我的文件中应该包含哪些文件 gitignore对于 Android Studio 项目 我见过几个例子 全部包括 iml但 IntelliJ 文档说 iml必须包含在您的源代码管理中 更新至Android Studio 3 0请在评论中分享
  • 如何得到拓扑排序的所有解

    大家好我正在尝试解决这个问题我意识到它想要获得拓扑排序问题的所有解决方案 我知道如何只获得一种可能的解决方案 这是我的代码http ideone com IiQxiu static ArrayList
  • 在没有互联网访问的情况下安装 pythonnet

    我正在尝试在无法访问互联网的计算机上安装 pythonnet 在连接的机器上 我从 Github 下载了 pythonnet master zip 从 pypi 下载了 pythonnet 2 4 0 tar gz 当我尝试时pip ins
  • 防止 Visual Studio Code 中的自动完成

    我正在使用新的视觉工作室代码 In a SQL file any time you type case it automatically adds end as if you were building a case block Even
  • 向 django 添加自定义语言

    我正在将我的网站翻译成欧盟的 24 种语言 其中包括 Malti 语言 该语言未在 django 默认支持的语言中列出 我想知道是否有一种方法可以向 django 添加自定义语言 以便它可以与本机 i18n url 函数一起使用 Thank
  • 在 IE 中 contenteditable div 的输入框中插入文本

    我正在尝试在输入框中插入文本contenteditable分区当我点击输入框时 光标不出现 双击输入框后可以插入文本 这个问题出现在IE中 div div
  • 图层中的 Alpha 检测在模拟器上正常,而不是在 iPhone 上

    首先 检查一下这个非常方便的扩展CALayer来自其他地方的SO 它可以帮助您确定图层内容中的点是否已分配CG图像参考是否透明 注意 不能保证图层的contents具有代表性或回应 就好像它是一个CG图像参考 当然 这可能会对更广泛地使用上