我无法以编程方式移动按钮。
我在viewDidLoad中使用此代码,我不使用自动布局:
button.frame.origin = CGPoint(x: 0, y: 0)
但是按钮在运行时仍保留在屏幕上的原始位置。
奇怪的是,坐标实际上正在更新,但没有在屏幕上显示。
如果我运行以下代码:
print(button.frame.origin.x) // prints 45.0
button.frame.origin = CGPoint(x: 0, y: 0)
print(button.frame.origin.x) // prints 0.0
但是在屏幕上按钮保持在45。
我做错了什么?
答案 0 :(得分:6)
在viewDidAppear
方法中更改按钮位置,它会在运行时更改它的位置,您的代码将是:
override func viewDidAppear(animated: Bool) {
button.frame.origin = CGPoint(x: 0, y: 0)
}
从这篇文章:Difference between viewDidLoad and viewDidAppear
当视图控制器首次加载到内存中时, viewDidLoad
只调用一次。这是您希望实例化任何实例变量并构建在此视图控制器的整个生命周期中存在的任何视图的位置。但是,此时通常尚未看到该视图。
viewDidAppear
,并且可以在视图控制器的生命周期中多次调用(例如,当模式视图控制器被关闭并且视图再次可见时)。您可以在此处执行任何布局操作或在UI中执行任何绘图 - 例如,呈现模态视图控制器。
答案 1 :(得分:0)
也许是一个长镜头(?),但是......
而不是:
button.frame.origin = CGPoint(x: 0, y: 0)
尝试:
var frame = button.frame
frame.origin = CGPoint(x: 0, y: 0)
button.frame = frame
编辑:我建议这样做的原因是,我认为button.frame
会返回按钮框架矩形的副本,因此您不会直接更改{{1}原始origin
实例的子属性,这就是未反映更改的原因。
答案 2 :(得分:0)
好吧,我猜UIView
个子类只监听-setFrame:
setter(在谈论-frame
属性时);更改其子值,即使是非对象(因此不能使-size
和-origin
属性上的设置者超载以作出反应),也不会立即产生IMO效果。
在这种情况下,您必须通过其他变量修改框架,并通过-setFrame:
将其设置回来,如其他帖子所示。