2016-06-09 71 views
3

這個問題聽起來很容易,但它讓我發瘋。 我在IB中創建了一個名爲iBag的白色視圖,並且它的大小取決於屏幕大小。如何設置UIView大小,以編程方式無約束地匹配parrent

enter image description here

現在我想以編程方式創建一個新的UIView,並通過此代碼相同的大小和位置的子視圖添加到IBAG

let newView = UIView() 
newView.frame = (frame: CGRect(x: 0, y: 0, width: iBag.frame.width, height: iBag.frame.height)) 
newView.backgroundColor = UIColor.redColor() 
iBag.addSubview(newView) 

enter image description here

我也試過界限但沒沒有幫助。 我可以使用約束來解決這個問題,但我想知道什麼是錯的。

+2

你在哪裏實例化ViewWillAppear中的新視圖? –

+0

@SandeepBhandari In viewDidLoad – Seifolahi

+0

你可以在ViewDidAppear中試試嗎? –

回答

12

所以很多答案,沒人解釋什麼是錯。

我會盡力的。 您在之前通過超視框設置您的newView的框架,自動佈局引擎開始工作以確定視圖位置。所以,當你使用newViewsuperview幀時,你會使用初始幀,這在大多數情況下都不正確。你有3種方法可以做正確的事情:爲你的newView使用自動佈局(約束),或者在viewDidLayoutSubviews方法中設置newView的幀(它在自動佈局引擎結束它的時候調用,所以幀變成實際的;注意這個方法可以被稱爲多重或者設置自動調整掩碼爲newView

0

可能是這將工作: -

subview.bounds.size = parentView.bounds.size 

subview.center = parentView.center 

但在你的情況下,widthheight在裏面的CGRect應

width: parentView.bounds.size.width 
height: parentView.bounds.size.height 

,然後添加到它的父爲子視圖。

+0

不,結果相同。 – Seifolahi

8

試試這個:

斯威夫特1和2:

newView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] 

斯威夫特3+:

newView.autoresizingMask = [.flexibleWidth, .flexibleHeight] 

如果它不工作,也這樣:

iBag.autoresizesSubviews = true

+0

第一行works.tnx – Seifolahi

1

可能,這將幫助你

override func viewDidLayoutSubviews() { 

    let newView = UIView() 
    newView.frame = iBag.bounds 
    newView.addConstraints(iBag.constraints) 
    newView.backgroundColor = UIColor.redColor() 
    iBag.addSubview(newView) 

} 

希望這會幫助你。

+0

我現在編輯我的答案檢查。 –

+0

對不起,但仍然沒有結果 – Seifolahi

+0

您是否在故事板或約束佈局中使用自動調整大小? –

0

試試這個代碼:

let newView = UIView() 
newView.frame = (frame: CGRect(x: iBag.frame.origin.x, y: iBag.frame.origin.y, width: iBag.frame.size.width, height: iBag.frame.size.height)) 
newView.backgroundColor = UIColor.redColor() 
iBag.addSubview(newView) 
4

試試這個

subview.frame = parentView.bounds

subview.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]

parentView.addSubview(subview)

0

不使用約束可能是什麼錯誤。如果您的故事板/筆尖設置爲使用AutoLayout(默認情況下處於啓用狀態),則AutoLayout系統會覆蓋設置幀/邊框,並且您必須使用約束來使佈局看起來正確。 (或設置自動調整大小面具轉換爲約束的旗幟。我不記得是什麼標誌被稱爲似乎並不能在此刻找到它。)

1

試試這個,

override func viewDidLayoutSubviews() { 


    newView.frame = (frame: CGRect(x: 0, y: 0, width: iBag.frame.width, height: iBag.frame.height)) 

} 

或者您可以使用viewWillAppearviewDidAppear來設置框架。

因爲在viewDidload你的iBag的框架是相同的,這是在你的界面生成器(故事板)。現在它將根據您運行的約束和設備大小進行更改。所以,在viewDidload你的新視圖變舊幀不改幀。所以,最好使用viewDidLayoutSubviewsviewWilAppear

第二件事,無論是使用自動佈局還是無處不在。在父視圖中使用自動佈局是不好的做法,而不是在子視圖中使用。

+0

這不是一個好的解決方案,因爲viewDidLayoutSubviews被多次調用。所以會創建許多「新視圖」。 –

+1

對呀@ jn-se編輯我的答案!現在,我覺得很好 – Lion

相關問題