Живите с продолжительностью, ведя себя странно с UILabel - PullRequest
0 голосов
/ 27 мая 2018

РЕДАКТИРОВАТЬ : Я бы на самом деле хотел анимировать свойство textColor.Я думал, что это будет то же решение, что и для backgroundColor, но, очевидно, нет, потому что textColor недоступно в layer.Я нашел решение для этого здесь .

Я пытаюсь случайным образом менять цвет фона UILabel каждую секунду.Код, который я использую, прекрасно работает в обычном представлении, но слишком быстро повторяется, когда я вызываю его на метке.Как будто анимация с продолжительностью не занимает много времени на этикетке.Есть идеи, почему это так?Я на самом деле хотел бы изменить цвет текста ярлыка, поэтому важно, чтобы он работал на ярлыке.

colorChanges(v: lbl) // TOO FAST!
colorChanges(v: someView) // PERFECT
colorChanges(v: self.view) // PERFECT

Код анимации

func colorChanges(v: UIView) {
    UIView.animate(withDuration: 1.0, animations: {
        v.backgroundColor = UIColor(displayP3Red: CGFloat(arc4random()) / CGFloat(UInt32.max), green: CGFloat(arc4random()) / CGFloat(UInt32.max), blue: CGFloat(arc4random()) / CGFloat(UInt32.max), alpha: 1.0)
    }, completion: {
        (value: Bool) in
        self.colorChanges(v: v)
    })
}

Странное поведение

enter image description here

1 Ответ

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

попробуйте ниже измененный метод:

func colorChanges(v: UIView) {
    UIView.animate(withDuration: 1.0, animations: {
            v.layer.backgroundColor = UIColor(displayP3Red: CGFloat(arc4random()) / CGFloat(UInt32.max), green: CGFloat(arc4random()) / CGFloat(UInt32.max), blue: CGFloat(arc4random()) / CGFloat(UInt32.max), alpha: 1.0).cgColor
        }, completion: { [weak self]
            (value: Bool) in
            self?.colorChanges(v: v)
        })
    }

Пожалуйста, попробуйте обновить ответ для метки textColor animation:

        UIView.transition(with: v, duration: 1.0, options:.transitionCrossDissolve, animations: {
            v.backgroundColor = UIColor(displayP3Red: CGFloat(arc4random()) / CGFloat(UInt32.max), green: CGFloat(arc4random()) / CGFloat(UInt32.max), blue: CGFloat(arc4random()) / CGFloat(UInt32.max), alpha: 1.0)

            if let label = v as? UILabel {
                label.textColor = UIColor(displayP3Red: CGFloat(arc4random()) / CGFloat(UInt32.max), green: CGFloat(arc4random()) / CGFloat(UInt32.max), blue: CGFloat(arc4random()) / CGFloat(UInt32.max), alpha: 1.0)
            }
        }) { [weak self] (success) in
            self?.colorChanges(v: v)
        }
...