我尝试使用此代码通过View
在启动应用时更改单独viewDidLoad
的位置:
let xPosition = dynView.frame.origin.x - 100
//View will slide view
let yPosition = dynView.frame.origin.y;
let height = dynView.frame.size.height
let width = dynView.frame.size.width
UIView.animate(withDuration: 1.0, animations: {
self.dynView.frame = CGRect(x: xPosition, y: yPosition, width: width, height: height)
})
但是,如果我使用viewDidLoad
分配给按钮
@IBAction
代码中运行
我猜这里错过了一些东西,但我无法弄清楚是什么。
答案 0 :(得分:3)
请参阅您的回答 - 关于使用约束的评论:
是的,我知道。我认为这与它有关吗?是个 viewDidLoad后加载的约束?
这是正确的,来自viewDidLoad()文档:
在控制器的视图加载到内存后调用。
与检查约束的设置是否已完成(子视图已布置)无关。
如果我没有误会,你要找的是viewDidLayoutSubviews()方法:
调用以通知视图控制器其视图刚刚布局 它的子视图。
您的视图控制器可以覆盖此方法以进行更改 该视图列出了其子视图。这个的默认实现 方法什么都不做。
因此,不要在viewDidLoad()
中实现更改视图的y位置的代码,而是尝试将其放在viewDidLayoutSubviews()
中,如下所示:
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let xPosition = dynView.frame.origin.x - 100
let yPosition = dynView.frame.origin.y
let height = dynView.frame.size.height
let width = dynView.frame.size.width
UIView.animate(withDuration: 1.0, animations: {
self.dynView.frame = CGRect(x: xPosition, y: yPosition, width: width, height: height)
})
}
同时强> 如果您不希望在弹出/关闭下一个ViewController后让动画重复,您可以声明标志属性以确定是否启动动画,类似于:
var isAnimated = false
override func viewDidLayoutSubviews() {
if isAnimated == false {
super.viewDidLayoutSubviews()
UIView.animate(withDuration: 1.0, animations: {
self.btn.frame.origin.y = 20
}, completion: { _ in
self.isAnimated = true
})
}
}
附加说明:
我建议更改约束的值,而不是直接更改帧大小/原点。您可能需要查看this question/answer.
希望这会有所帮助。