我正在学习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?
答案 0 :(得分:0)
您的原始代码虽然工作异常,但实际上定义不明确。在将视图添加到视图层次结构之前,不应该开始设置动画。你正在逃避它,但不要这样做。
在你接近正确的第二种方法中,问题是你已经使background
成为非惰性计算属性。因此,每当您致电model.background
时,您都会得到一个不同的对象。
鉴于你是如何撰写的,背景的lazy
属性可能就是你的意思。
正如@dasdom所说,BoardModel
是一个非常糟糕的视图名称。这应该是BoardView
。
一般来说,你的流程有点奇怪。我可能会BoardView
为自己添加背景。如果控制器实际上将背景添加到其他视图(BoardView
除外),那么确实奇怪,您需要重新考虑代码结构。
答案 1 :(得分:0)
当您访问background
的{{1}}时(这是一个非常糟糕的视图名称!),会创建并返回一个新视图。我认为这不是你想要的。