123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- //
- // Created by Tom Baranes on 23/08/16.
- // Copyright (c) 2016 IBAnimatable. All rights reserved.
- //
- import UIKit
- public class ActivityIndicatorAnimationTriangleSkewSpin: ActivityIndicatorAnimating {
- // MARK: Properties
- fileprivate let duration: CFTimeInterval = 3
- // MARK: ActivityIndicatorAnimating
- public func configureAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
- let x = (layer.bounds.size.width - size.width) / 2
- let y = (layer.bounds.size.height - size.height) / 2
- let triangle = ActivityIndicatorShape.offsetTriangle.makeLayer(size: size, color: color)
- triangle.frame = CGRect(x: x, y: y, width: size.width, height: size.height)
- triangle.add(defaultAnimation, forKey: "animation")
- layer.addSublayer(triangle)
- }
- }
- // MARK: - Setup
- private extension ActivityIndicatorAnimationTriangleSkewSpin {
- var defaultAnimation: CAKeyframeAnimation {
- let timingFunction = CAMediaTimingFunction(controlPoints: 0.09, 0.57, 0.49, 0.9)
- let animation = CAKeyframeAnimation(keyPath: .transform)
- animation.keyTimes = [0, 0.25, 0.5, 0.75, 1]
- animation.timingFunctions = [timingFunction, timingFunction, timingFunction, timingFunction]
- animation.values = [
- NSValue(caTransform3D: CATransform3DConcat(makeRotateXTransform(angle: 0), makeRotateYTransform(angle: 0))),
- NSValue(caTransform3D: CATransform3DConcat(makeRotateXTransform(angle: CGFloat.pi), makeRotateYTransform(angle: 0))),
- NSValue(caTransform3D: CATransform3DConcat(makeRotateXTransform(angle: CGFloat.pi), makeRotateYTransform(angle: CGFloat.pi))),
- NSValue(caTransform3D: CATransform3DConcat(makeRotateXTransform(angle: 0), makeRotateYTransform(angle: CGFloat.pi))),
- NSValue(caTransform3D: CATransform3DConcat(makeRotateXTransform(angle: 0), makeRotateYTransform(angle: 0)))]
- animation.duration = duration
- animation.repeatCount = .infinity
- animation.isRemovedOnCompletion = false
- return animation
- }
- func makeRotateXTransform(angle: CGFloat) -> CATransform3D {
- var transform = CATransform3DMakeRotation(angle, 1, 0, 0)
- transform.m34 = CGFloat(-1) / 100
- return transform
- }
- func makeRotateYTransform(angle: CGFloat) -> CATransform3D {
- var transform = CATransform3DMakeRotation(angle, 0, 1, 0)
- transform.m34 = CGFloat(-1) / 100
- return transform
- }
- }
|