#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