2013-11-18 4 views
1

Я вращаю некоторые представления в своем коде, и кажется, что некоторые из них получают странные фракции, например, 10.0 становится 10.000000000000002.CGAffineTransformRotate 64-разрядные выпуски

Вы можете увидеть сами с этим фрагментом:

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)); 
} 

Любая помощь очень ценится!

ответ

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)

+0

Это, кажется, работает, но как вы знаете, что вам нужно использовать для а, б, в, г, ТХ и ти? Потому что это не всегда 90 градусов в самом проекте. –

+0

@RickvanderLinde Обновлено с пояснениями – cobbal

+0

Хорошо, я провел некоторое дополнительное тестирование, но это, похоже, единственное, что на самом деле «фиксирует» его. Теперь я просто должен прочитать немного о матрице вращения, никогда не использовал ее раньше ... Спасибо! –

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))); 
} 
+0

Пробовал это, но CGRectIntegral работает после фрагментации, поэтому 10,10 в конечном итоге становится 11,11 и далее 12,12 ... –

Смежные вопросы