CGAffineTransformRotate 64位问题

时间:2013-11-18 21:10:41

标签: objective-c

我在我的代码中旋转了一些视图,似乎有些视图得到了奇怪的分数,例如,10.0变为10.000000000000002。

您可以使用此代码段自行查看:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 10.0, 10.0)];

for (NSUInteger i = 0; i < 100; i++) {
    view.transform = CGAffineTransformRotate(view.transform, ((90.0) / 180.0 * M_PI));
    NSLog(@"%@", NSStringFromCGRect(view.frame));
}

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

如果浮点不准确导致问题,精确90度的一种可能的解决方法是手动指定矩阵:

// rotate by 90˚
view.transform = CGTransformConcat(view.transform,
                                   CGAffineTransformMake(0, 1, -1, 0, 0, 0));

这些幻数来自旋转矩阵的等式:

⎛ cos α      sin α       0 ⎞
⎜-sin α      cos α       0 ⎟
⎝     0          0       1 ⎠

然后左边的6个参数成为CGAffineTransformMake的参数

α =90˚时,我们得到(0,1,-1,0,0,0)

答案 1 :(得分:0)

如果您要标准化这些值,可以使用CGRectIntegral。来自the docs(这可能会更改矩形)

  

一个矩形,其原点和大小的整数值最小   包含源矩形。也就是说,给定一个矩形   分数原点或大小值,CGRectIntegral舍入   矩形的原点向下,其大小向上到最近的整体   整数,结果包含原始矩形。

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 10.0, 10.0)];

for (NSUInteger i = 0; i < 100; i++) {
    view.transform = CGAffineTransformRotate(view.transform, M_PI_2);
    NSLog(@"%@", NSStringFromCGRect(CGRectIntegral(view.frame)));
}