2016-05-26 81 views
1

我试图更改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做工精细,它会立即更改。这种方法有什么问题?

+0

试着把你的代码放在'viewWillLayoutSubviews()' – AnthonyR

+0

@AnonyRoani但是如果我应该完成这些动作5次呢?它会添加许多额外的代码行。 – Slava

+0

我不明白你为什么使用这些委托方法。为什么不在你的元素框架被改变之后调用'self.layoutIfNeeded()'?这将更新框架。我认为你不应该为你的情况使用'layoutSubviews()'方法(因为你的UIButton框架似乎一直在改变) – AnthonyR

回答

0

调用self.layoutIfNeeded()之后,您的元素框架已被更改将更新框架。当框架始终在变化时最好使用它。

0

这个逻辑应该是viewWillLayoutSubviews

viewdidLayoutSubviews布局完成后调用。将布局逻辑放在那里可能会很糟糕,因为您可能会进入无尽的布局和重新布局循环。

+0

但我应该调用这个函数5次。它会使我的代码更长。此外,我从'viewdidLayoutSubviews'调用的一些方法工作正常。为什么它不起作用? – Slava

+0

对我来说没有看到更多的代码。布局逻辑应该发生在'viewWillLayoutSubviews'中,所以你可能会因为处理它而感到一些奇怪[viewDidLayoutSubviews' –

相关问题