Mr *_*son 4 position view swift
我试图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)
})
Run Code Online (Sandbox Code Playgroud)
viewDidLoad但是,如果我使用 a 分配给按钮,这似乎不能直接在代码中工作@IBAction
我猜我在这里遗漏了一些东西,但我不知道是什么。
参考您在评论中关于使用约束的答案:
是的,我愿意。我想这和它有关系吗?约束是在 viewDidLoad 之后加载的吗?
是的,来自viewDidLoad()文档:
在控制器的视图加载到内存后调用。
与检查约束设置是否已完成(子视图已布局)无关。
如果我没有记错的话,您正在寻找的是viewDidLayoutSubviews()方法:
调用以通知视图控制器其视图刚刚布置了其子视图。
您的视图控制器可以重写此方法,以便在视图布置其子视图后进行更改。此方法的默认实现不执行任何操作。
viewDidLoad()因此,不要在try to let it 中实现更改视图 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)
})
}
Run Code Online (Sandbox Code Playgroud)
另外: 如果你不想让动画在弹出/关闭下一个 ViewController 后重复,你可以声明一个flag属性来确定是否启动动画,类似于:
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
})
}
}
Run Code Online (Sandbox Code Playgroud)
附加说明:
我建议更改约束值,而不是直接更改帧大小/原点。您可能想检查这个问题/答案。
| 归档时间: |
|
| 查看次数: |
1837 次 |
| 最近记录: |