2011-09-27 21 views
38

我有一個自定義的UIView,它有一個專門的,手動設置的縱向和橫向方向的框架,因爲autoresizingMasks在我的情況下不起作用。如何強制UIView的layoutSubviews。

我設置在這一框架:

- (void)viewWillAppear:(BOOL)animated 

而且它按預期工作。

我的問題是,現在,我的UIView還具有子視圖也有縱向/橫向的專用位置。

我定位在這些子視圖:

- (void)layoutSubviews 

如果我現在離開我的viewController在例如縱向,旋轉爲橫向另一個的viewController,然後回來這個的viewController我看到我的觀點得到了正確的調整,但我的觀點的子視圖,其中獲得定位在layoutSubviews尚未重新定位,而是以動畫方式後調整這個觀點已經出現了。

我什麼都不做在viewDidAppear,我已經打過電話

- (void)layoutIfNeeded 

除了:

- (void)setNeedsLayout 

在viewWillAppear中,但它似乎並沒有改變任何東西。

任何想法我做錯了嗎?

謝謝。

回答

76

今天也有類似的問題。我解決它首先調用

  • -setNeedsLayout:設置視圖需要佈局的標誌,事後調用
  • -layoutIfNeeded:立即檢查標誌和 - 因爲它是手動設置的前 - 作爲結果layoutSubviews被調用。

不知道這是最好的方式,但它的工作原理;)

+1

此方法似乎比只調用self.view.layoutSubviews() –

+0

更好。調用layoutSubviews將使用您設置的任何約束來排列子視圖。如果你在做什麼不使用約束,你需要setNeedsLayout,然後layoutIfNeeded立即強制佈局更新。 – Toby

5

我建議設置初始框架中的viewDidLoad然後改變方向更改視圖框在

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

你不需要在layoutSubviews(不知道你是否有任何任何明確的動畫,但它聽起來喜歡它),因爲任何幀更改都將同步到旋轉動畫。

當關閉屏幕的方向應該還是旋轉,所以你的觀點,並應正確再次轉移回到屏幕上時定位。

我還建議看WWDC 2010屆123覆蓋這個東西,在更多的細節「建築動畫驅動的UI」。

+0

我用willAnimateRotationToInterfaceOrientation旋轉自己的看法,同時在屏幕上,它工作得很好。在layoutSubviews中我也沒有明確的動畫,這就是問題所在。我沒有明確地制定觀點的動畫,仍然是動畫。 「離屏時,方向仍然應該旋轉」..真的嗎?從來沒有爲我工作,我總是不得不重新定位在viewWillAppear。感謝與Session的提示,儘管會盡快觀看本次會議。 – myell0w

-1

對我工作是[self.view setNeedsDisplay]。這在整個視圖上調用重繪。您也可以通過在特定視圖上調用setNeedsDisplay來重繪選定的視圖,這是我在我的例子中完成的,並且它完美地工作。

+0

這會導致調用'drawRect:'方法。 –

2

在SWIFT 3個@iOS 10.1

override func viewWillAppear(animated: Bool){ 

    //Doesn`t neeed to call super to work 
    view.setNeedsLayout() 
} 

運行完美

相關問題