2017-10-13 20 views
0

我在ovalView內有一個imageView約束與自動佈局。當在ViewDidLayoutSubviews中定義不正確的幀位置

內部viewDidLayoutSubviews(),我創建一個UILabel

let label = UILabel(frame: imageView.frame) 
imageView.superview?.addSubview(label) 

標籤的幀稍微示出了從ImageView的偏心。

但是,如果我將上述代碼移動到viewDidAppear()之內,那麼label完全集中於imageView,但用戶看到的是不希望的更改。

如何讓我的代碼保存在viewDidLayoutSubviews()中並使其工作?

+0

你知道,設定框架改變原產地,是視圖的左上角錨?也就是說,您必須減去標籤寬度的一半才能將其居中在x軸上。 – LinusGeffarth

+0

爲什麼它在ViewDidAppear中工作呢? – Kashif

回答

0

對於可能面臨類似問題的其他人。我能夠加入

self.view.layoutIfNeeded() 
在我的代碼

後讓我在viewDidLayoutSubviews()代碼

let label = UILabel(frame: imageView.frame) 
imageView.superview?.addSubview(label) 
1

當調用viewDidLayoutSubviews時,您不能假定您的視圖在調用該方法之前有最終幀。在你的情況下,這就是發生了什麼。當你打電話給viewDidAppear時,你的視圖畫出了所有的畫面,你得到了正確的畫面,這就是爲什麼它適合你。所以請改爲viewDidAppear

+0

或者在'viewDidLoad'或'viewWillAppear'中,如果您不希望用戶看到更改。 – LinusGeffarth

+0

@LinusGeffarth的確如此。但我會在'viewWillappear'中添加它。 –

+0

它在viewDidLoad或viewWillAppear中不起作用。它只能在viewDidAppear中工作,用戶可以看到發生的變化(不受歡迎)。 – Kashif