Ios 以编程方式更改对象的大小和位置

Ios 以编程方式更改对象的大小和位置,ios,swift,Ios,Swift,我正在尝试更改viewDidLayoutSubviews()中某些对象的大小和位置。方法fixPositions()被调用,但所有更改仅在我转到下一个屏幕后应用 这是我的密码: override func viewDidLayoutSubviews() { let width = filterMainView.frame.width / 5 filterView.frame = CGRectMake(0.0, 0.0, width, 50.0) fixPosition

我正在尝试更改viewDidLayoutSubviews()中某些对象的大小和位置。方法fixPositions()被调用,但所有更改仅在我转到下一个屏幕后应用

这是我的密码:

override func viewDidLayoutSubviews() {
    let width = filterMainView.frame.width / 5

    filterView.frame = CGRectMake(0.0, 0.0, width, 50.0)

    fixPositions(filterSubview, image: filterImage, button: filterButton, width: width)
}

func fixPositions(mainView: UIView, image: UIImageView, button: UIButton, width: CGFloat) {
    let buttonFrame = CGRectMake(0.0, 0.0, width, 50.0)

    button.frame = buttonFrame
    mainView.frame = buttonFrame
    image.frame = CGRectMake((width - 30.0)/2, 10.0, 30.0, 30.0)
}

此外,filterView工作正常,它会立即更改。此方法有什么问题?

此逻辑应位于
viewWillLayoutSubviews


viewdilayoutsubviews
在布局完成后调用。将布局逻辑放在那里可能是不好的,因为您可能会陷入无休止的布局和重新布局循环。

此逻辑应该在
viewWillLayoutSubviews中。


viewdilayoutsubviews
在布局完成后调用。将布局逻辑放在那里可能不好,因为您可能会进入一个无休止的布局和重新布局循环。

调用
self.layoutifneedd()
更改元素框架后,将更新框架。最好在框架总是在变化时使用它。

调用
self.layoutifneed()
在元素框架发生变化后,将更新框架。最好在帧不断变化时使用它。

尝试将代码放入
视图willlayoutsubviews()
@AnthonyRoani,但如果我完成这些操作5次呢?它将添加许多额外的代码行。我不明白为什么要使用这些委托方法。在更改元素框架之后,为什么不调用self.layoutifneed()?这将更新帧。我认为您不应该为您的案例使用
layoutSubviews()
方法(因为您的按钮框架似乎一直在更改)@AnthonyRoani是的!终于成功了!谢谢酷:-)!所以我会写我的答案,试着把你的代码放到
视图willlayoutsubviews()
@AnthonyRoani,但是如果我完成这些操作5次呢?它将添加许多额外的代码行。我不明白为什么要使用这些委托方法。在更改元素框架之后,为什么不调用self.layoutifneed()?这将更新帧。我认为您不应该为您的案例使用
layoutSubviews()
方法(因为您的按钮框架似乎一直在更改)@AnthonyRoani是的!终于成功了!谢谢酷:-)!所以我会写我的答案,但我应该调用这个函数5次。这将使我的代码更长。此外,我从
viewdilayoutsubviews
调用的一些方法工作正常。为什么它不工作?我不得不说,没有看到更多的代码。布局逻辑应该发生在
viewWillLayoutSubviews
中,因此处理它时可能会遇到一些奇怪的情况
viewdillayoutsubviews
,但是我应该调用这个函数5次。这将使我的代码更长。此外,我从
viewdilayoutsubviews
调用的一些方法工作正常。为什么它不工作?我不得不说,没有看到更多的代码。布局逻辑应该发生在
viewWillLayoutSubviews
中,因此处理它时可能会遇到一些奇怪的情况
viewdillayoutsubviews