gpt4 book ai didi

ios - 具有极大值的 CALayer zPosition 排序

转载 作者:技术小花猫 更新时间:2023-10-29 11:18:47 27 4
gpt4 key购买 nike

我遇到了一个问题,当值变大时,Core Animation 似乎忽略了我的 zPosition 值。

例子

这很容易复制。

CGFloat largeZPosition = 1000000000;

CALayer *topLayer = ...
CALayer *bottomLayer = ...
bottomLayer.frame = CGRectOffset(topLayer.frame, 50, 50);

topLayer.zPosition = largeZPosition + 1;
bottomLayer.zPosition = largeZPosition;

// Intentionally sort the sublayers array in the wrong order.
rootLayer.sublayers = @[ topLayer, bottomLayer ];

对于较小的 z 位置值,这会按预期运行。即使子层数组没有正确排序,顶层显示在底层之上,如下所示:

correct

然而,对于上面显示的例子,结果如下:

enter image description here

显然这是不正确的。

问题

根据我的需要,我无法对子层数组进行手动排序,因此我依赖于 zPosition 来按预期执行。所以我的问题是:我该如何解决这个问题?谢谢。

最佳答案

那是因为 QuartzCore 似乎将 zPosition 转换为 float,所以当 CGFloatdouble 时它会失去精度. IEEE 单精度 float 使用 24 位作为有效数精度,因此大于 2^24 的整数可能无法精确表示。例如,

float largeZPosition = 1000000000;
float largeZPositionPlus1 = 1000000001;
NSLog(@"%f %f %d", largeZPosition, largeZPositionPlus1, largeZPosition == largeZPositionPlus1);

输出

1000000000.000000 1000000000.000000 1

下一个可精确表示的整数是 1000000064。

请注意,CALayer.zPosition 被定义为 CGFloat,只要底层 CGFloat 能够做到这一点。检查

layer.zPosition = 1000000001;
NSLog(@"%f", layer.zPosition);

在 64 位 OS X 上,CGFloatdouble,输出

1000000001.000000

因此,在 CALayer 公共(public) Objective-C 类级别,精度没有丢失。在 QuartzCore 的其他地方,转换为单精度 float 发生了。

我建议使用小于 2^24 的整数(包括加法结果)。鉴于 zPosition 具有浮点类型,您可以使用较小的分数值而不是巨大的整数值。

关于ios - 具有极大值的 CALayer zPosition 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25071192/

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