Почему 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()

Другие вопросы по тегам