2016-05-26 102 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' –

相關問題