Как я могу анимировать слой градиента, который увеличивает его ширину? - PullRequest
0 голосов
/ 06 июля 2018

Я использую простой UIView, который я хочу анимировать, и я добавил к нему слой градиента. Я хочу увеличить ширину вида и слой, помещенный на вид, но я получаю только то, что вид увеличивает свою ширину, а не слой.

Пример: допустим, у меня есть UIView с height = width = 50 Я оживляю его, устанавливая ширину: width += 50. Эта анимация работает. Если я делаю то же самое со слоем, то это происходит. Слой не увеличивает свою ширину. Я пытался кое-что исправить (см. Комментарии в коде), но ничего не работает.

Вот мой код

func performNextTitleAnimation() {

        let overlayViewHeight = overlayView.frame.size.height
        let overlayViewWidth = overlayView.frame.size.width
        let animationHeight: CGFloat = 48
        let overlayViewHalfHeight = (overlayViewHeight) / 2

        swipeAnimation = UIView(frame: CGRect(x: 0, y: overlayViewHalfHeight - (animationHeight/2), width: 48, height: animationHeight))

        swipeAnimation.backgroundColor = .gray

        swipeAnimation.layer.cornerRadius = swipeAnimation.frame.size.height / 2

        gradientLayer.frame = swipeAnimation.bounds

        overlayView.addSubview(swipeAnimation)
        swipeAnimation.layer.addSublayer(gradientLayer)

        UIView.animate(withDuration: 1.2, delay: 0, options: [.repeat], animations: {
            self.gradientLayer.cornerRadius = 24

            self.swipeAnimation.frame.size.width += 50

            //Things I tried, but not working
            //1.) self.gradientLayer.frame.size.width += 50
            //2.) self.gradientLayer.frame.size.width = self.swipeAnimation.frame.size.width
            //3.) self.gradientLayer.bounds = self.swipeAnimation.bounds

        }, completion: nil)
    }

Градиентный слой

gradientLayer.colors = [UIColor.white.cgColor, animationColor.cgColor]
        gradientLayer.locations = [0.0, 1.0]
        gradientLayer.transform = CATransform3DMakeRotation(3*(CGFloat.pi) / 2, 0, 0, 1)

Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 06 июля 2018

Лучший результат, которого я когда-либо достиг, когда мне нужно было анимировать размер CAGrandientLayer s, это использовать его как layerClass пользовательского UIView:

class GrandientView: UIView {
  override class var layerClass : AnyClass {
    return CAGradientLayer.self
  }

  var gradientLayer: CAGradientLayer {
    // it is safe to force cast here
    // since we told UIView to use this exact type
    return self.layer as! CAGradientLayer
  }

  override init(frame: CGRect) {
    super.init(frame: frame)
    // setup your gradient
  }
}
...