Белый экран при попытке исчезновения между изображениями в UIImageView - PullRequest
0 голосов
/ 09 июля 2019

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

Я использовал https://stackoverflow.com/a/42710002/7908770 для справки и не могу понять, где я ошибся: (

class ViewController: UIViewController {

    var bckgImageView = UIImageView(image: UIImage(named: "one"))

    override func viewDidLoad() {
        super.viewDidLoad()

        bckgImageView.frame = self.view.frame
        self.view.addSubview(bckgImageView)

        animateBackground()

    }

    func animateBackground() {

        UIView.transition(with: self.view,
                          duration: 5,
                          options: .transitionCrossDissolve,
                          animations: { self.bckgImageView.image = UIImage(named: "two") },
                          completion: nil)

    }

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

AutoLayout еще не рассчитан, когда в viewDidLoad

Вы можете установить кадр при изменении макета в viewDidLayoutSubviews. Попробуйте это

class ViewController: UIViewController {

    var bckgImageView = UIImageView(image: UIImage(named: "one"))

    override func viewDidLoad() {
        super.viewDidLoad()

        bckgImageView.frame = self.view.frame
        self.view.addSubview(bckgImageView)

        animateBackground()

    }

    func animateBackground() {

        UIView.transition(with: self.view,
                          duration: 5,
                          options: .transitionCrossDissolve,
                          animations: { self.bckgImageView.image = UIImage(named: "two") },
                          completion: nil)

    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        bckgImageView.frame = self.view.frame
    }

}
0 голосов
/ 09 июля 2019

Во-первых, вы устанавливаете рамку представления изображения на рамку «корневого» представления, которое еще не определено в viewDidLoad().Вам гораздо лучше использовать ограничения и разрешить авто-макету изменять размер представления.

Во-вторых, если вы запускаете анимацию в viewDidLoad() или даже в viewDidLayoutSubviews(), экран еще не виден -- так что вы не видите начальное изображение (или вы видите его очень кратко, если анимация короткая).

Итак, начните анимацию с viewDidAppear(), или, сделайте немного задержку,как в следующем:

class ViewController: UIViewController {

    var bckgImageView = UIImageView(image: UIImage(named: "one"))

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.addSubview(bckgImageView)
        bckgImageView.translatesAutoresizingMaskIntoConstraints = false

        // constrain image view to all 4 sides
        NSLayoutConstraint.activate([
            bckgImageView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
            bckgImageView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
            bckgImageView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
            bckgImageView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
            ])

    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        // start animation after 1 second
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: {
            self.animateBackground()
            })

    }

    func animateBackground() {

        UIView.transition(with: self.view,
                          duration: 5,
                          options: .transitionCrossDissolve,
                          animations: { self.bckgImageView.image = UIImage(named: "two") },
                          completion: nil)

    }
}
...