设置新创建的 CAShapeLayer 的正确框架

2024-01-27

简而言之:

  1. 苹果没有设置frame or bounds for a CAShapeLayer自动(并且苹果尚未实现等效的[UIView sizeThatFits])
  2. 如果您使用路径边界框的大小设置框架......一切都会出错。无论你如何尝试设置它,它都会搞砸路径

那么,以编程方式设置新创建的框架的正确方法是什么?CAShapeLayer与新添加的CGPath?苹果的文档对此事保持沉默。

我尝试过但不起作用的事情:

  1. 创建一个CAShapeLayer
  2. 创建一个CGPath,将其添加到图层中
  3. 检查图层的frame - it's {{0,0},{0,0}}
  4. Set: layer.frame = CGPathGetBoundingBox( layer.path )
  5. 框架现在是正确的,但路径现在是双偏移 - 更改frame导致路径有效地移动额外(x,y) pixels

  6. Set: layer.bounds = CGPathGetBoundingBox( layer.path )

  7. ……一切都变得疯狂。一切都不再有意义了
  8. 尝试通过以下方式修复它layer.position = CGPathGetBoundingBox( layer.path ).origin
  9. ...没有骰子;还是疯了。

我尝试过的一件事确实有效,但在其他地方引起了问题:

编辑:一旦您自动旋转屏幕,此操作就会中断。我的猜测:苹果的自动旋转requires控制“变换”属性。

  1. 创建一个CAShapeLayer
  2. 创建一个CGPath,将其添加到图层中
  3. 检查图层的框架 - 它是{{0,0},{0,0}}
  4. Set: layer.frame = CGPathGetBoundingBox( layer.path )
  5. Set: layer.transform = CGAffineTransformMakeTranslation( CGPathGetBoundingBox( layer.path ).origin.x * -1, // same for y-coord: set it to "-1 * the path's origin

这是可行的,但是......许多第三方代码假设CALayer是身份。

不应该这么难!我在这里肯定做错了什么?

(我有一个建议:“每次添加路径时,手动运行一个自定义函数来将所有点移动-1 * (top-left-point.x, top-left-point.y)“。同样,这有效 - 但它非常复杂)


将 layer.bounds 设置为路径边界是正确的做法 - 您希望使图层的局部坐标空间与路径匹配。但是您还需要设置图层的位置属性,以将其移动到其超级图层中的正确位置。

(设置 .frame 会转化为框架为您计算 .bounds 和 .position 的正确值,但它始终保持bounds.origin 不变,当路径边界具有非零原点时,这不是您想要的。)

因此,假设您没有更改锚点的通常值 (.5, .5) 并且希望将图层定位到与其超级图层的原点齐平,这样的操作应该可行:

CGRect r = CGPathGetBoundingBox(layer.path);
layer.bounds = r;
layer.position = CGPointMake(r.size.width*.5, r.size.height*.5);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设置新创建的 CAShapeLayer 的正确框架 的相关文章

随机推荐

  • 将 python 反汇编从 dis.dis 转换回 codeobject

    有没有办法从通过获取的反汇编中创建代码对象dis dis 例如 我使用编译了一些代码co compile print lol
  • 如何将PostgreSQL从9.6版本升级到10.1版本而不丢失数据? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在将 PostgreSQL 数据库用于我的 Ruby on Rails 应用程序 在 Mac OS
  • 如何关闭 iOS 设备[重复]

    这个问题在这里已经有答案了 是的 实际上 我认为我所要求的是不可能的 但我想知道您是否知道如何使用 swift 或 Objective C 代码关闭 iPhone 或者至少进入飞行模式 您无法使用苹果提供的公共 API 来执行此操作 这可以
  • Python:LookupError:未知编码:十六进制

    我正在使用名为 Tweepy 的 Twitter API 它一直工作正常 然后我重新启动了服务器 现在我得到了这个 gt gt gt import tweepy Traceback most recent call last File
  • 选择出现超过 3 次的行

    我有一个表 active users 我想从中选择 user id 出现超过 2 次且 notification 0 的行 只想要单个结果 需要查询结果 Id User id Mobile last seen notified 1 2585
  • FFMPEG“分段错误”与网络流源

    我使用版本 4 2 2 静态 来自 https johnvansickle com ffmpeg https johnvansickle com ffmpeg 最终代码将位于 Amazon AWS lambda 上 目标 使用 url 流并
  • HttpRequest.Content.IsMimeMultipartContent() 在应该返回 true 时返回 false

    我需要将 HTTP 请求作为 MultiPartFormData 发送到 REST 控制器 它正在工作 但现在我在控制器上进行的检查声称请求的类型不正确 即使我可以在调试器中看到请求的类型正确 以供参考 这是调用它的控制台应用程序代码 us
  • Play Framework 2.2.x 多个路由文件

    我已经读完这部剧了 对于 Scala 书中关于模块的部分 我似乎无法弄清楚如何从引用的模块导入路由 我已将模块设置为 build sbt 文件中的库依赖项 并尝试将路由导入到路由文件中 如下所示 构建 sbt libraryDependen
  • 如何使用 Emacs 更改文件的读/写模式?

    如果文件设置为只读模式 如何在 Emacs 中将其更改为写入模式 反之亦然 M x 只读模式 在非常旧的 Emacs 版本中 命令是 M x 切换只读 在我的 Windows 机器上 这相当于 Alt x 调出元提示符并输入 只读模式 来调
  • 检查一个列表是否以另一个列表的元素开头

    如果列表的开头恰好是另一个列表的元素 那么最简单 最Pythonic的方法 是什么 考虑以下示例 li 1 4 5 3 2 8 Should return true startsWithSublist li 1 4 5 Should ret
  • 如何在我的网站中实施 HSTS

    我有一个网站 来自 godaddy 的域名并托管在 hostgator 中 当我手动更新证书时 我可以将我的网站重定向到 https 但它总是从 google 搜索转到 http 在网上搜索后 我了解到考虑到Strict Transport
  • Java ant 脚本不显示警告

    我有一个 1 4 java 代码 我想用 1 5 编译器编译它 因为我想看到所有警告消息 我向 javac 添加了 Xlint 选项 但输出似乎没有变化 但我知道代码中至少有几个警告 我将这两行添加到我的 ant 脚本的编译目标标记中
  • memcached数据缓存的设计模式

    可以轻松地将可选的 memcached 缓存封装到现有的数据库查询中 例如 旧 仅限数据库 function getX x get from db return x end 新 带有内存缓存的数据库 function getX x get
  • 了解 C# 中运行时代码生成的各种选项(Roslyn、CodeDom、Linq 表达式,...?)

    我正在开发一个应用程序 我想在其中动态生成数值计算的代码 为了性能 作为数据驱动操作来执行此计算太慢 为了描述我的要求 请考虑此类 class Simulation Dictionary
  • 有没有办法让vim打开一个目录及其所有子目录中的所有.C和.H文件?

    我想在 vim 中对大约 20 个 C 和 H 文件执行替换 并且我想一次打开它们 所有文件分布在多个嵌套目录中 命令在最顶层父目录中执行 我可以只使用 vim 来完成此操作 还是需要 find 命令和 p 选项 如图所示 关于这个答案 h
  • 如何在浏览器关闭时关闭 vaadin 会话但保留 http 会话?

    我正在开发一个 vaadin 7 应用程序 使用 jaas 进行用户身份验证和授权 并在应用程序服务器 glassfish 中定义领域 我有这样的要求 用户可以保持登录状态一段时间 这样他就不需要每次都输入密码 我通过设置 http 会话的
  • Github 限制访问

    我正在使用github 我正在尝试找出如何限制我拥有的承包商的回购访问权限 我有主要的 Rails 代码库 还有一个承包商将为我做一些 css ux 类型的工作 我想让承包商能够仅将代码签入 github 的某些文件夹 理想情况下 我可以让
  • 有没有更好的方法来获取 PHP 的货币汇率?

    使用以下代码的货币汇率有时有效 有时无效 而且一点也不可靠 有没有更好的方法来获取 PHP 的货币汇率 public function getJPYtoUSDExchangeRate from JPY to USD amount 1 dat
  • 如何使用 setuptools 排除或忽略软件包预发布?

    我正在使用 setuptoolstensorflow包依赖 我跑步时注意到setup py install 它发现tensorflow 1 13 0rc2 当我跑步时pip 它发现tensorflow 1 12 然后我发现这张票 https
  • 设置新创建的 CAShapeLayer 的正确框架

    简而言之 苹果没有设置frame or bounds for a CAShapeLayer自动 并且苹果尚未实现等效的 UIView sizeThatFits 如果您使用路径边界框的大小设置框架 一切都会出错 无论你如何尝试设置它 它都会搞