我正在学习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
之外),那么这确实很奇怪,您需要重新考虑代码结构。