在 Obj-c 中使用 truncatingRemainder() 方法

Use truncatingRemainder() method in Obj-c

提问人:kroko 提问时间:5/23/2019 更新时间:6/17/2020 访问量:412

问:

我正在尝试在 objective-c 中创建一个 3D 立方体动画。这是一段我想使用我的代码的代码。有人知道如何将这些方法转换为 objective-c 吗?我在 Apple 文档中没有找到任何内容。

let hasCompletedPaging = (xOffset / scrollView.frame.width).truncatingRemainder(dividingBy: 1) == 0
iOS Objective-C Swift 方法

评论


答:

1赞 rmaddy 5/24/2019 #1

truncatingRemainder(dividingBy: 1)仅给出结果的小数部分。因此,比较与检查结果是否为整数相同。truncatingRemainder(dividingBy: 1)0

一个简单的转换可以是:

BOOL hasCompletedPaging = (xOffset / scrollView.frame.width) == round(xOffset / scrollView.frame.width);

但由于浮点数的不精确性,这并不理想。

更好的检查可能是:

BOOL hasCompletedPaging = fabs(xOffset / scrollView.frame.width - round(xOffset / scrollView.frame.width)) < 0.000001;

但最简单的解决方案是使用 .当结果为零时,表示第一个数字是第二个数字的整数倍:fmod

BOOL hasCompletedPaging = fmod(xOffset, scrollView.frame.width) < 0.000001;

评论

2赞 Martin R 5/24/2019
fmod(xOffset, scrollView.frame.width)
0赞 kroko 5/27/2019
@MartinR 如何转换var rightAnimationPercentComplete = hasCompletedPaging ?0 : 1 - (xOffset / scrollView.frame.width).truncatingRemainder(dividingBy: 1)
0赞 rmaddy 5/27/2019
@kroko .但是(在任何一种语言中)如果它是完整的,你为什么要 0%?double rightAnimationPercentComplete = hasCompletedPaging ? 0.0 : (1.0 - fmod(xOffset, scrollView.frame.width));
2赞 FirExpl 6/17/2020 #2

根据 Apple 的 truncatingRemainder 文档,此函数的 C 样式版本如下所示:

CGFloat TruncatingReminder(CGFloat x, CGFloat dividingBy) {
  return x - dividingBy * floor(x / dividingBy);
}

P.S. 我知道我的回答已经很晚了,但可能对某些人有用。