我正在学习Swift,但在将UIView从不同的功能移到我时遇到了问题。如果我使用这个:

ViewController:

let boardView = BoardView()

@IBAction func startButtonTapped(sender: UIButton) {
    view.addSubview(boardView.background)
}


类BoardView:

class BoardView : UIView {

   let multiplier: CGFloat = 0.95
   let screenSize = UIScreen.mainScreen().bounds

   var background: UIView {
      let boardSize: CGFloat = multiplier * screenSize.width
      let board = UIView(
         frame: CGRectMake(-boardSize,
         screenSize.height / 2 - boardSize / 2,
         boardSize,
         boardSize)
      )

       board.layer.cornerRadius = 8.0
       board.backgroundColor = UIColor.blackColor()
       UIView.animateWithDuration(0.15, animations: {
          board.center.x = self.screenSize.width / 2
      })
      return board
   }
}


动画有效(对我而言是违反直觉的)。如果我尝试将UIView从另一个函数中移出,如下所示:

ViewController按钮:

@IBAction func startButtonTapped(sender: UIButton) {
    view.addSubview(boardView.background)
    boardView.moveBackground()
}


BoardView:

class BoardView : UIView {

let multiplier: CGFloat = 0.95
let screenSize = UIScreen.mainScreen().bounds

var background: UIView {
    let boardSize: CGFloat = multiplier * screenSize.width
    let board = UIView(
        frame: CGRectMake(-boardSize,
        screenSize.height / 2 - boardSize / 2,
        boardSize,
        boardSize))

    board.layer.cornerRadius = 8.0
    board.backgroundColor = UIColor.blackColor()
    return board
}

func moveBackground() {
    UIView.animateWithDuration(0.15, animations: {
        self.background.center.x = self.screenSize.width / 2
    })
 }
}


动画无效。如果我在ViewController中使用animateWithDuration,也不会发生任何事情。

如何将UIView从创建位置之外的其他位置移动?

最佳答案

您的原始代码虽然工作异常,但实际上定义不正确。在将视图添加到视图层次结构之前,不应开始对其进行动画处理。您正在摆脱它,但不要那样做。

在您更接近正确的第二种方法中,问题在于您已将background设置为非惰性计算属性。因此,每次调用model.background时,都会得到一个不同的对象。

鉴于您是如何编写的,背景的lazy属性可能是您真正的意思。

正如@dasdom指出的那样,BoardModel对于视图来说是一个非常不好的名字。这应该是BoardView

通常,您的流程有点奇怪。我可能会让BoardView将背景添加到自身。如果控制器实际上是将背景添加到其他视图(BoardView之外),那么这确实很奇怪,您需要重新考虑代码结构。

10-06 07:05