Почему UIImageView не загружается должным образом с помощью Swift
В основном я хочу создать дорогу, по которой герой будет двигаться до начала игры, чтобы пользователь мог видеть его первые шаги, но проблема в том, что когда я размещаю код в override func viewDidLoad
это только загрузить внешний вид изображения, что я публикую в Main.storyboard
не тот код, используя print
это показывает, что изображения на месте, где они должны быть, но это не то, что я вижу на экране. В качестве альтернативы, я помещаю тот же код в @IBAction func play
и после нажатия кнопки воспроизведения изображения загружаются так, как им нужно. Вот код, который я положил в viewDidLoad:
@IBOutlet weak var hero: UIImageView!
@IBOutlet weak var bigroad: UIImageView!
@IBOutlet weak var road: UIImageView!
@IBOutlet weak var roadTwo: UIImageView!
@IBOutlet weak var play: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
self.play.hidden = false
self.hero.hidden = false
self.bigroad.hidden = false
self.road.hidden = false
self.roadTwo.hidden = false
self.hero.center.x = (width / 2) + 3
self.hero.center.y = ((height / 2.5) + (height / 3.5)) - 46
self.bigroad.center = CGPointMake(width / 2 , (height / 2.5) + (height / 3.5))
self.road.center = CGPointMake(width / 2 + 39, (height / 2.5) + (height / 3.5) - 29)
self.roadTwo.center = CGPointMake((width / 2 ) + 78, ((height / 2.5) + (height / 3.5)) - 58)
Как я уже сказал, когда я положил его тот же код в @IBAction func play
и когда начинается func play, все на месте. Мой вопрос: почему изображения не загружаются на месте, если они должны быть в viewDidLoad, но отлично загружаются в функции воспроизведения? Что я делаю неправильно и как я могу предотвратить свою ошибку?
2 ответа
Вам нужно переместить код фрейма в точку, когда все процессы автоматического размещения завершены. Например:
var layedOut = false
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if !layedOut {
// perform your frame code
self.hero.center.x = (width / 2) + 3
self.hero.center.y = ((height / 2.5) + (height / 3.5)) - 46
self.bigroad.center = CGPointMake(width / 2 , (height / 2.5) + (height / 3.5))
self.road.center = CGPointMake(width / 2 + 39, (height / 2.5) + (height / 3.5) - 29)
self.roadTwo.center = CGPointMake((width / 2 ) + 78, ((height / 2.5) + (height / 3.5)) - 58)
}
}
Обратите внимание, что viewDidLayoutSubviews
может вызываться несколько раз, поэтому вам нужно поймать точку, когда все уже на экране и отключить код инициализации кадра в этом методе, например с флагом
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
layedOut = true
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
layedOut = false
}
weak var
Розетки не загружены, попробуйте сделать это на viewWillAppear() Это слишком рано, чтобы сделать это на viewDidLoad()