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. Я не уверен, что якорь должен делать для анимации вращения, но, похоже, он не делает то, что вам нужно.

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

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

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

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

  • Автоматический макет визуального языка программирования для массива представлений
  • Swift 3 и lldb: Рамка печати UIView, заданная шестнадцатеричный адрес
  • Рамка изображения UIView больше кадра
  • UIView скрытое свойство ... есть ли еще больше?
  • Представление «прыгает», когда я добавляю его в UIWindow как subview (через свойство rootViewController) и делаю флип
  • Внедрение автоматического макета для представлений, сгенерированных программным способом
  • Добавление подпрограммы и ее программное программирование с ограничениями
  • Как распространять изменение размера subview для изменения размера супервизора?
  • Изменение размера UIView с углами
  • Подвижность UIView UIWindow не вращается
  • Swift: подклассификация UITextView или UICollectionView и правильная инициализация
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.