2015-10-04 51 views
1

我在UIView(outerView)中有一個UIView(稱爲innerView)。 outerView具有Autolayout約束,並始終在根視圖中居中。 innerView只是任意放置在outerView中,沒有任何限制。他們都通過網點連接到視圖控制器。在UIView中居中的子視圖不能快速工作?

我想innerView始終在outerView中居中。當然,我可以使用autolayout,但我只需要測試是否可以通過代碼來移動它(因爲我發現它是我的真實項目中的問題)

不幸的是,我發現我無法移動innerView碼。任何人都知道原因?

這裏是代碼:

import UIKit 

class ViewController: UIViewController { 

    // outerView is 300 X 300 
    @IBOutlet weak var outerView: UIView! 

    // innerView is 140 X 140, and it is the subview of outerView 
    @IBOutlet weak var innerView: UIView! 

    override func viewWillLayoutSubviews() { 
     super.viewWillLayoutSubviews() 

     innerView.center = CGPoint(x: outerView.bounds.midX, y: outerView.bounds.midY) 
     innerView.autoresizingMask = .None 
     // result is : (150.0, 150.0) which is correct 
     print(innerView.center) 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 

     // result is : (78.0, 222.0) which is not correct 
     print(innerView.center) 
    } 
} 
+0

如果打印'outerView.bounds'在'viewWillLayoutSubviews ',你會得到什麼? – Sulthan

+0

我得到'(0.0,0.0,300.0,300.0)'。如果我在設置後在'viewWillLayoutSubviews'中打印'innerView.center',我得到'(150,150)'這是正確的,但是如果我在'viewDidAppear'中打印它,我得到'(78.0,222.0)'這是顯然不是我想要的。 – rrrain

+0

您也可以編程方式添加自動佈局約束。 – nhgrif

回答

1

截至viewDidLayoutSubviews,它只是通知你的情況下,該視圖控制器的根視圖的所有子視圖定位在希望的地方。您不能保證這些子視圖的所有其餘子視圖也將保持一致,因爲它是父視圖本身的責任。

所以將你的中心innerView代碼爲:

override func viewDidAppear(animated: Bool){ 
     super.viewDidAppear(animated) 
     innerView.center = CGPoint(x:outerView.bounds.midX , y:outerView.bounds.midY) 
} 

如果支持方向:

override func willAnimateRotationToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) { 
innerView.center = CGPoint(x:outerView.bounds.midX , y:outerView.bounds.midY) 
    } 
+0

是的,我已經嘗試過,它的工作原理。但它並不完美,它只能在縱向模式下工作,而不能在橫向模式下工作。原因很明顯。改變特徵不會讓'viewDidAppear'再次被調用。 – rrrain

+0

最後,它的工作原理。非常感謝。但我仍然有兩個問題。 1)通常,我們在'viewWillLayoutSubview'中改變視圖幾何。正如你所提到的,它只是改變視圖控制器根視圖子視圖佈局的地方,那麼我們應該在哪裏改變子視圖子視圖的視圖幾何? 2)'willAnimateRotationToInterfaceOrientation'已被棄用,所以它不適合使用。 – rrrain

+0

我沒有提到'''viewWillLayoutSubview''',正常情況下你可以通過約束來做什麼。 '''viewWillTransitionToSize''替換'''''''''''''''''如果這個答案有幫助,請接受它,謝謝 –

1

試試這個:

innerView.center = outerView.convertPoint(outerView.center, fromView: outerView.superview) 
+0

試過了,依然不起作用。但非常感謝。事實上,我認爲他們是相同的東西,只是採取兩種不同的方式。 – rrrain