2016-10-09 40 views
0

我想建立一個視圖與兩個集合視圖和中心,這反過來有內部元素視圖。斯威夫特自動佈局:約束在子視圖不工作

我一直在試圖設置使用視覺形式類似這樣的約束:

func setupViews() { 

    self.view.addSubview(playGroundView) 
    self.view.addSubview(firstCollectionView) 
    self.view.addSubview(secondCollectionView) 

    self.playGroundView.backgroundColor = UIColor.clear 


    aTextView.backgroundColor = UIColor.yellow 
    titleTextView.backgroundColor = UIColor.green 
    searchBar?.backgroundColor = UIColor.darkGray 


    if #available(iOS 9.0, *) { 
     playGroundView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true 
     firstCollectionView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true 
     secondCollectionView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true 
    } else { 
     // Fallback on earlier versions 
    } 

    self.playGroundView.addSubview(publishButton) 
    self.playGroundView.addSubview(searchBar!) 
    self.playGroundView.addSubview(aTextView) 
    self.playGroundView.addSubview(titleTextView) 

    publishButton.addConstraint(NSLayoutConstraint(item: publishButton, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 44)) 
    aTextView.addConstraint(NSLayoutConstraint(item: aTextView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 44)) 
    titleTextView.addConstraint(NSLayoutConstraint(item: titleTextView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 44)) 
    searchBar!.addConstraint(NSLayoutConstraint(item: searchBar!, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 44)) 

    self.playGroundView.addConstraintsWithFormat("V:[v0]-2-|", views: publishButton) 
    self.playGroundView.addConstraintsWithFormat("H:[v0]-2-|", views: publishButton) 
    self.playGroundView.addConstraintsWithFormat("V:|-2-[v0(44)]", views: searchBar!) 


    self.view.bringSubview(toFront: aTextView) 

    self.playGroundView.layoutIfNeeded() 
    self.playGroundView.layoutSubviews() 

    self.view.addConstraintsWithFormat("H:|-8-[v0(100)][v1][v2(100)]-8-|", views: secondCollectionView,playGroundView,firstCollectionView) 

    self.view.addConstraintsWithFormat("V:[v0]-2-|", views: playGroundView) 
    self.view.addConstraintsWithFormat("V:[v0]-2-|", views: secondCollectionView) 
    self.view.addConstraintsWithFormat("V:[v0]-2-|", views: firstCollectionView) 



    if(self.isCreate){ 
     self.titleTextView.text = self.recipeDictionary?.value(forKey: "recipeName") as! String! 
    } 
} 


// Function to set constraints 

func addConstraintsWithFormat(_ format: String, views: UIView...) { 

     var viewsDictionary = [String: UIView]() 
     for (index,view) in views.enumerated() { 
      let key = "v\(index)" 
      viewsDictionary[key] = view 
      view.translatesAutoresizingMaskIntoConstraints = false 
     } 
     addConstraints(NSLayoutConstraint.constraints(withVisualFormat: format, options: NSLayoutFormatOptions(), metrics: nil, views: viewsDictionary)) 
    } 

我沒有看到子視圖中的元素(playGroundView)被渲染。有人可以建議我在這裏做錯了什麼?

回答

3

我會嘗試以下方法進行調試:

  1. 暫時定了堅實的背景色playGroundView代替UIColor.clear並運行它使playGroundView是有一個正確的大小和位置。
  2. 將邊框臨時設置爲缺失的子視圖並運行它以查看視圖是否在playGroundView範圍內。或者,您也可以運行代碼,轉到Xcode>調試>視圖調試>捕獲視圖層次
  3. 設置translatesAutoresizingMaskIntoConstraints = false爲publishButtonsearchBar等添加到playGroundView之前。雖然在助手功能addConstraintsWithFormat中執行該操作並沒有錯,但不需要多次撥打該電話。
+0

我曾嘗試設置操場視圖的背景顏色。視圖的框架與我預期的一樣。包含的視圖元素沒有被顯示,我也嘗試爲它們設置背景,就像你在代碼中看到的一樣。 – userx

+0

您也可以嘗試將約束添加到playGroundView,而不是直接在子視圖上設置它們。例如'self.playGroundView.addConstraint(NSLayoutConstraint(item:publishButton,attribute:.height,relatedBy:.equal,toItem:nil,attribute:.notAnAttribute,multiplier:1,constant:44))' –

+0

我懷疑子視圖'幀是零,因此甚至沒有顯示背景顏色。 –

相關問題