为什么 UIImageView 使用 Swift 没有正确加载

Why did UIImageView did not load properly using Swift

基本上我想在游戏开始前创建英雄继续前进的道路,这样用户就可以看到他的第一步,但问题是当我 post 在 override func viewDidLoad 中编写代码时,它只会加载图像外观我在 Main.storyboard 中 post 不是那个代码,使用 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 中,但在播放功能中加载完美?我做错了什么?如何避免我的错误?

weak var

插座未加载,请尝试在 viewWillAppear() 上执行此操作在 viewDidLoad() 上执行此操作还为时过早

当所有自动布局过程完成时,您需要将框架代码移动到点。例如:

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
}