Во-первых, вы устанавливаете рамку представления изображения на рамку «корневого» представления, которое еще не определено в 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)
}
}