2017-06-08 2 views
1

I childViewController verwenden Ansicht in Projekt zu trennen, aber einige seltsame Problem passiert ist, hier ist mein Code.childViewController.view.frame in UIView vorhanden anderen Wert

class ViewController: UIViewController { 

    var container = UIView() 
    var childVC = ChildViewController() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     view.backgroundColor = .white 

     addChildViewController(childVC) 
     childVC.didMove(toParentViewController: self) 

     addChildView() 

     setContainerFrame() 
    } 

    func setContainerFrame() { 
     container.frame = CGRect(x: 0, y: 100, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height - 100) 
     container.backgroundColor = .red 
     view.addSubview(container) 
    } 

    func addChildView() { 
     let frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height) 
     childVC.view.frame = frame 
     childVC.view.backgroundColor = .green 
     container.addSubview(childVC.view) 
    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 
     print("childVC.view.frame: \(childVC.view.frame)") 
    } 
} 


class ChildViewController: UIViewController { 
} 

wenn ich tauschen die func addChildView Ordnung() aufrufen und func setContainerFrame() in der Viewcontroller viewDidLoad(), xcode'console druckt verschiedene Rahmenprotokoll.

+0

versuchen, es in 'viewDidLayoutSubviews()' –

Antwort

1

Dies ist aufgrund der autoresizingMask des childVC.view. Standardmäßig ist dies auf eine flexible Breite und Höhe eingestellt. Also, wenn Sie den Rahmen des Behälters und dann der Rahmen des childVC.view stellen Sie dann erhalten Sie den tatsächlichen Wert, den Sie festgelegt, aber wenn Sie es umkehren und setzen den Rahmen des childVC.view und dann den Behälter den Rahmen des childVC. Die Ansicht wird automatisch auf die gleiche relative Breite und Höhe aktualisiert.

Zum Beispiel, wenn die Rahmengröße für den Behälter war 100 x 100, Sie können es dann auf 200 x 200 für childVC.view die Rahmengröße verdoppelt werden ändern.

So entfernen Sie diesen Satz die childVC.view.autoresizingMask = [] so bleibt es, wie Sie es eingestellt.

+0

Ihre Antwort ist wirklich hilfreich, löste meine Frage, danke! – huangxinyu

0

Das seltsame Verhalten tritt auf, weil in addChildView() Funktion Sie die Ansicht des untergeordneten View-Controllers als Unteransicht zur Containeransicht hinzufügen, aber der Rahmen der Containeransicht wird in der Funktion setContainerFrame() gesetzt, die noch nicht aufgerufen wird. Das bedeutet, dass Sie einer Ansicht, deren Rahmen noch nicht festgelegt wurde, eine Unteransicht hinzufügen.

+0

glaube ich nicht, was Sie den Grund zu machen childVC.view.width zweimal normaler sagen ist. – huangxinyu

+0

Muss versucht werden, Clip auf Bounds-Eigenschaft für beide Ansichten wahr zu machen? –

+0

danke für den Rat, ich möchte eigentlich den Grund wissen. – huangxinyu

Verwandte Themen