animateWithDuration未显示

时间:2015-09-16 21:30:02

标签: swift animation uiview

我正在学习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?

2 个答案:

答案 0 :(得分:0)

您的原始代码虽然工作异常,但实际上定义不明确。在将视图添加到视图层次结构之前,不应该开始设置动画。你正在逃避它,但不要这样做。

在你接近正确的第二种方法中,问题是你已经使background成为非惰性计算属性。因此,每当您致电model.background时,您都会得到一个不同的对象。

鉴于你是如何撰写的,背景的lazy属性可能就是你的意思。

正如@dasdom所说,BoardModel是一个非常糟糕的视图名称。这应该是BoardView

一般来说,你的流程有点奇怪。我可能会BoardView为自己添加背景。如果控制器实际上将背景添加到其他视图(BoardView除外),那么确实奇怪,您需要重新考虑代码结构。

答案 1 :(得分:0)

当您访问background的{​​{1}}时(这是一个非常糟糕的视图名称!),会创建并返回一个新视图。我认为这不是你想要的。