CALayer анимация для ширины - PullRequest
0 голосов
/ 23 мая 2018

У меня есть один вид, в котором нужно добавить один слой.Я успешно добавил слой, но теперь я хочу сделать анимацию, поскольку его ширина означает, что слой начинает заполняться с метки «старт» и заканчивается на метке «ожидание ...».Я пытаюсь добавить анимацию с CABasicAnimation , она начинается с начала, но не заполняется должным образом.Пожалуйста, проверьте видео, как для большего понимания.

func startProgressAnimation()
    {
        self.ivStarted.isHighlighted = true
        let layer = CALayer()
        layer.backgroundColor = #colorLiteral(red: 0.4980392157, green: 0.8352941176, blue: 0.1921568627, alpha: 1)
        layer.masksToBounds = true

        layer.frame = CGRect.init(x: self.viewStartedAwaited.frame.origin.x, y: self.viewStartedAwaited.frame.origin.y, width: 0.0, height: self.viewStartedAwaited.frame.height)
        self.ivStarted.layer.addSublayer(layer)

        CATransaction.begin()

        let boundsAnim:CABasicAnimation = CABasicAnimation(keyPath: "bounds.size.width")
        boundsAnim.fromValue = NSNumber.init(value: 0.0)
        boundsAnim.byValue = NSNumber.init(value: Float(self.viewStartedAwaited.frame.size.width / 2.0))
        boundsAnim.toValue = NSNumber.init(value: Float(self.viewStartedAwaited.frame.size.width))
        let anim = CAAnimationGroup()
        anim.animations = [boundsAnim]
        anim.isRemovedOnCompletion = false
        anim.duration = 5
        anim.fillMode = kCAFillModeBoth

        CATransaction.setCompletionBlock{ [weak self] in
            self?.ivAwaited.isHighlighted = true
        }


        layer.add(anim, forKey: "bounds.size.width")
        CATransaction.commit()

    }

Вот видео, которое я получаю с помощью этого кода.https://streamable.com/h6tpp

Не правильно

Not Proper

Надлежащее изображение

Proper image

1 Ответ

0 голосов
/ 23 мая 2018

Просто установите

layer.anchorPoint = CGPoint(x: 0, y: 0)

После этого он будет работать в соответствии с вашими требованиями.

Привязка по умолчанию (0,5,0,5) означает, что увеличение или уменьшение ширины происходит равномернос обеих сторон.Anchorpoint (0,0) означает, что слой по существу прикреплен к верхнему левому углу, поэтому независимо от того, какую новую ширину он получит, изменение происходит справа.То есть не имеет значения, является ли ваш путь анимации ключом «bounds» или «bounds.size.width».Опорная точка - это то, что определяет, где происходит изменение

...