2017-06-08 2 views
1

childViewControllerを使用してプロジェクトのビューを区切りますが、奇妙な問題が発生しました。ここに私のコードがあります。childViewController.view.frameのUIViewに異なる値があります

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 { 
} 

IがのViewController者のviewDidLoad()、xcode'console印刷異なるフレームログに)((FUNCのaddChildViewを呼び出す)およびFUNCのsetContainerFrame順序を交換します。

+0

'viewDidLayoutSubviews()'で試してください –

答えて

1

これは、childVC.viewのautoresizingMaskによるものです。デフォルトでは、幅と高さが柔軟に設定されています。したがって、コンテナのフレームを設定し、次にchildVC.viewのフレームを設定すると、設定した実際の値が得られますが、逆にしてchildVC.viewのフレームを設定し、次にコンテナをchildVCのフレームに設定すると、ビューは、相対的な幅と高さが同じになるように自動的に更新されます。

たとえば、コンテナのフレームサイズが100 x 100で200 x 200に変更した場合、childVC.viewのフレームサイズは2倍になります。

これを削除するには、childVC.view.autoresizingMask = []を設定しておきます。

+0

あなたの答えは本当に役立つ、私の質問を、おやすみを解決! – huangxinyu

0

addChildView()機能では、コンテナビューにサブビューとして、子View Controllerのビューを追加しているが、コンテナビューのフレームがまだ呼び出されていない機能setContainerFrame()に設定されているため、奇妙な動作が発生します。つまり、フレームがまだ設定されていないビューにサブビューを追加しています。

+0

あなたが言うことは、childVC.view.widthを通常の2倍にする理由ではないと思います。 – huangxinyu

+0

両方のビューに対してboundsプロパティのクリップを作成しようとしましたか?アドバイスのために –

+0

よかったら、私は実際にその理由を知りたいです。 – huangxinyu

関連する問題