【问题标题】:Why did UIImageView did not load properly using Swift为什么 UIImageView 没有使用 Swift 正确加载
【发布时间】:2016-07-19 12:04:11
【问题描述】:

基本上我想在游戏开始前创建英雄将继续前进的道路,这样用户就可以看到他的第一步,但问题是当我在override func viewDidLoad 中发布代码时,它只会加载我在@987654322 中发布的图像外观@不是那个代码,使用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 播放开始时,一切都已到位。 我的问题是为什么图像没有加载到位,如果它们需要在 viewDidLoad 中,但在播放功能中完美加载?我做错了什么以及如何防止我的错误?

【问题讨论】:

    标签: ios swift uiimageview iboutlet viewdidload


    【解决方案1】:

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

    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
    }
    

    【讨论】:

      【解决方案2】:
      weak var
      

      Outlets 未加载,请尝试在 viewWillAppear() 上执行此操作 在 vi​​ewDidLoad() 上执行此操作还为时过早

      【讨论】:

      • 错误。已加载网点,viewWillAppear 将给出相同的结果
      • 如果出口没有加载,他会因为play: UIButton!上的!而在self.play.hidden上崩溃。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多