Animate UIImageView появляется на экране строка за строкой - PullRequest
1 голос
/ 07 апреля 2020

Я хотел бы отобразить UIImageView с некоторой анимацией, и я думаю, что я хотел бы, чтобы он появлялся на экране попиксельно, перемещаясь слева направо, строка за строкой. Немного как принтер напечатал бы изображение. У меня нет понятия, с чего начать.

Я думал, может быть, наложение UIImageView на другое представление, которое может использовать анимацию, чтобы стать прозрачным, но как я могу это сделать?

1 Ответ

1 голос
/ 07 апреля 2020

Что ж, одна из идей заключается в том, что у нас есть один вид поверх вашего изображения, полностью охватывающий его. Давайте назовем это представление V. Переместите это представление вниз на 1 пункт, чтобы линия вашего изображения была видна. Затем создайте другой вид поверх вашего изображения, полностью покрывая его. Давайте назовем это представление H. Затем переместим это представление вправо на 1 пункт. Теперь один пиксель (или, точнее, сетка точек 1x1) вашего изображения выставлен.

Мы будем анимировать H вправо. Когда он достигнет конца, мы вернем его на место, переместим V и H на 1 пункт и повторим процесс.

Вот кое-что, с чего можно начать.

extension UIView {

    /**
     - Parameter seconds: the time for one line to reveal
     */
    func scanReveal(seconds: Double) {

        let colour = self.superview?.backgroundColor ?? UIColor.black

        let v = UIView(frame: self.bounds)
        v.backgroundColor = colour
        self.addSubview(v)

        let h = UIView(frame: self.bounds)
        h.backgroundColor = colour
        self.addSubview(h)

        v.frame.origin.y += 1

        // Animate h to the end.
        // When it reaches the end, bring it back, move v and h down by 1 and repeat.

        func move() {
            UIView.animate(withDuration: seconds, animations: {
                h.frame.origin.x = h.bounds.height
            }) { _ in
                h.frame.origin.x = 0
                h.frame.origin.y += 1
                v.frame.origin.y += 1

                if v.frame.origin.y > self.bounds.height {
                    return
                }
                move()
            }
        }
        move()
    }
}
...