2016-02-19 34 views
0

我創造新的子視圖SWIFT:不能點擊子視圖

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    controller = storyboard.instantiateViewControllerWithIdentifier("menu") as! MenuViewController 
    controller.view.frame = CGRectMake(0, -150, self.view.frame.size.width, 150); 
    mainView.addSubview(controller.view) 
    controller.view.layer.zPosition = 1 
    controller.viewDidLoad() 

然後我加上的viewController

按鈕,但我不能點擊按鈕...

我可以選擇其中的文本是我的新控制器下(我添加照片)

enter image description here

+0

你爲什麼要設置'zPosition?'添加它作爲子視圖會自動將它放在前面。 –

+0

你爲什麼要手動做所有其他的事情? –

+0

沒有zPosition不起作用:/ –

回答

0

你的代碼很少有問題。

首先,根據代碼的有限範圍,我不需要將層的zPosition屬性設置爲除默認值0之外的任何其他值。通過使用addSubview,您添加的視圖會自動添加到所有當前子視圖的頂部。

其次,從本質上來說,以編程方式創建框架沒有任何問題,但通常會導致屏幕尺寸不同的設備出現問題。另外,當您將視圖的寬度設置爲與另一個視圖的寬度相等時,我建議使用自動佈局,如果寬度發生變化,它將自動更新寬度。它還允許您跨所有設備屏幕尺寸/尺寸類別創建響應式界面。

controller.view.frame = CGRectMake(0, -150, self.view.frame.size.width, 150); 

第三,無需手動觸發controller.viewDidLoad()因爲一旦它的框架已經設定它的自動調用。

第四(!)您將視圖的框架設置爲隱藏在屏幕的頂部。我不確定這是否是正確的功能,但要確保您知道,通過將視圖的原點設置爲與框架的原點相同,視圖的底部將與頂部對齊它的超級觀點。

容器視圖控制器是包含其他視圖控制器的視圖控制器,允許您創建更多模塊化代碼,並將視圖分隔到託管視圖控制器中。應該使用這種模式。

有關更多信息,請參閱https://www.objc.io/issues/1-view-controllers/containment-view-controller/

在下面的代碼中,我還執行檢查以查看controller變量是否爲零,這將防止在嘗試強制解包控制器時發生崩潰並且它不屬於類MenuViewController。可以理解的是,這有些迂腐,因爲你可能確定被實例化的視圖控制器是正確的,但總是比安全感更好。

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
if let controller = storyboard.instantiateViewControllerWithIdentifier("menu") as? MenuViewController { 
    controller.view.frame = CGRectMake(0, -150, self.view.frame.size.width, 150); 
    // Frame may need to be modified to be made visible^
    addChildViewController(controller) 
    controller.willMoveToParentViewController(self) 
    mainView.addSubview(controller.view) 
    controller.widMoveToParentViewController(self) 
} 
+0

一個小問題:'viewDidLoad()'在視圖加載後調用,無論視圖是否在屏幕上。調用'controller.view.frame'會導致'viewDidLoad()'運行,甚至在'controller.view'被添加爲子視圖之前。 –

+0

@AaronBrager是的,你是對的!我已經更新了答案。 –

相關問題