iOS Core Animation: неправильная опорная точка для вращения

Я хотел бы реализовать базовую анимацию вращения в 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 Solutions collect form web for “iOS Core Animation: неправильная опорная точка для вращения”

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

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

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

Или:

 layer.bounds = CGPathGetBoundingBox(layer.path); 

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

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

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

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

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

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

Затем переведите обратно в нужное положение. Поэтому примените перевод справа и вниз.

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

  • Распространение специфического события касания для просмотра снизу
  • Как мне сделать переход между iOS на просмотр / переход?
  • drawRect: / renderInContext: проблемы
  • Встраивание локального видео в UIView
  • Как я могу нарисовать повернутый UIView с тенью, но без поворота тени
  • Выполнение многих операций UIKit, блокирующих основной поток
  • Как заставить UIButton всегда быть на высоте
  • AutoLayout и AVCaptureVideoPreviewLayer
  • Как удалить эффекты перехода UIViewWithView
  • Анимация removeFromSuperview
  • Как взять UIView с набором фоновых рисунков и уменьшить его вертикально с помощью анимации
  • Interesting Posts
    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.