Точка привязки и позиция CATransform3DMakeRotation в Swift

#ios #swift #calayer #catransform3d

#iOS #swift #calayer #catransform3d

Вопрос:

Привет, я пытаюсь повернуть CAShapeLayer треугольной формы. Кэшапелайер NorthPole определяется в пользовательском классе UIView. У меня есть две функции в классе, одна для настройки свойств слоя, а другая для анимации поворота. Анимация вращения работает нормально, но после завершения вращения она возвращается в исходное положение. Я хочу, чтобы слой оставался под заданным углом (positionTo = 90,0) после анимации поворота.

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

 private func setupNorthPole(shapeLayer: CAShapeLayer) {
    shapeLayer.frame = CGRect(x: self.bounds.width / 2 - triangleWidth / 2, y: self.bounds.height / 2 - triangleHeight, width: triangleWidth, height: triangleHeight)//self.bounds
    let polePath = UIBezierPath()
    polePath.move(to: CGPoint(x: 0, y: triangleHeight))
    polePath.addLine(to: CGPoint(x: triangleWidth / 2, y: 0))
    polePath.addLine(to: CGPoint(x: triangleWidth, y: triangleHeight))
    shapeLayer.path = polePath.cgPath
    shapeLayer.anchorPoint = CGPoint(x: 0.5, y: 1.0)
  

Функция анимации:

 private func animate() {
    let positionTo = CGFloat(DegreesToRadians(value: degrees))
    let rotate = CABasicAnimation(keyPath: "transform.rotation.z")
    rotate.fromValue = 0.0
    rotate.toValue = positionTo //CGFloat(M_PI * 2.0)
    rotate.duration = 0.5
    northPole.add(rotate, forKey: nil)
    let present = northPole.presentation()!
    print("presentation position x "   "(present.position.x)")
    print("presentation position y "   "(present.position.y)")


    CATransaction.begin()
    northPole.transform = CATransform3DMakeRotation(positionTo, 0.0, 0.0, 1.0)
    northPole.position = CGPoint(x: self.bounds.width / 2, y: self.bounds.height / 2)
    CATransaction.commit()
}
  

Комментарии:

1. Хорошо, извините за мой плохой ответ ранее. Я просто собираюсь предложить вам отбросить present , отбросить begin , отбросить commit и прочитать мою книгу, чтобы узнать, как выполнять вращение с помощью CABasicAnimation: apeth.com/iOSBook/ch17.html#_using_a_cabasicanimation

Ответ №1:

Чтобы устранить проблему, в пользовательском классе UIView мне пришлось переопределить layoutSubviews() следующим образом:

   super.layoutSubviews()
  let northPoleTransform: CATransform3D = northPole.transform
  northPole.transform = CATransform3DIdentity
  setupNorthPole(northPole)  
  northPole.transform = northPoleTransform