iOS Core Animation: неверная точка привязки для вращения - PullRequest
4 голосов
/ 16 ноября 2011

Я хотел бы реализовать базовую анимацию вращения в iOS, где представление постоянно вращается вокруг своей центральной точки.

Однако по какой-то причине точка привязки вращения всегда является исходной точкой родительского представления, ине центр вращающегося вида.
Следовательно, вид вращается вокруг верхнего левого угла экрана, даже если я вручную устанавливаю точку привязки.

Вот что я делаю:

// Add shape layer to view
CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init];
CGRect shapeRect = CGRectMake(0, 0, 100, 100);
UIBezierPath *roundedRect = [UIBezierPath bezierPathWithRoundedRect:shapeRect cornerRadius:5];
shapeLayer.path = roundedRect.CGPath;
shapeLayer.anchorPoint = CGPointMake(0.5, 0.5);
shapeLayer.fillColor = [[UIColor redColor] CGColor];

[self.view.layer addSublayer:shapeLayer];

// Set rotation animation
CATransform3D rotationTransform = CATransform3DMakeRotation(M_PI, 0, 0, 1);
CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
rotationAnimation.toValue = [NSValue valueWithCATransform3D:rotationTransform];
rotationAnimation.duration = 1.0f;
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = HUGE_VALF;

[shapeLayer addAnimation:rotationAnimation forKey:@"transform"];

Любая помощь будет оценена.

Ответы [ 4 ]

15 голосов
/ 22 ноября 2011

Путь не определяет границы слоя. Итак, ваш слой имеет CGRectZero границы. Ваш путь начинается с CGPointZero относительно границ. Слой вращается вокруг своего центра, который также CGPointZero ...

Итак, я вижу несколько вариантов:

layer.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(-50, -50,
                                                                100, 100)
                                        cornerRadius:5].CGPath;

Или:

layer.bounds = CGPathGetBoundingBox(layer.path);
3 голосов
/ 22 ноября 2011

Я также столкнулся с той же проблемой.Кажется, что для масштабирования и поворота используется верхняя левая точка привязки, даже если для нее вручную установлено значение (0,5, 0,5).Я исправил это в своем коде, вручную установив свойство frame или bounds слоя таким же размером, как ваш путь.

0 голосов
/ 17 ноября 2011

Вот как вы можете вращаться вокруг определенной точки без использования anchorPoint. Я не уверен, что anchorPoint должен делать для анимации вращения, но, похоже, он делает не то, что вы хотите.

«Первый» переводится, поэтому ваш центр вращения находится в начале координат. Поэтому примените перевод влево и вверх.

Затем поверните.

Затем переведите обратно в нужную позицию. Поэтому применяйте перевод вправо и вниз.

Вы делаете это одновременно, объединяя матрицы. Они идут в обратном порядке. Слева направо: перевод вправо / вниз, поворот, перевод влево / вверх.

0 голосов
/ 16 ноября 2011

Вы можете просто использовать методы UIView вместо методов слоя. По умолчанию они вращаются вокруг центра.

[UIView beginAnimations];
self.view.transform = CGAffineTransformMakeRotation(M_PI);
[UIView commitAnimations];
...