1

我爲自定義導航控制器創建了xib文件,在那個xib文件中我有3個UIButtons和1個UILabel。 在運行時,我將把這個xib文件作爲導航控制器。 我需要在ViewController中使用VFL(視覺格式語言)設置約束。如何使用Visual Formate語言爲xib文件設置約束

let tempView = Bundle.main.loadNibNamed("CustomNavigation", owner: self, options: nil)?.first as! CustomNavigationView 
    self.view.addSubview(tempView) 

    tempView.backgroundColor = UIColor.lightGray 
    //tempView.frame = CGRect(x: 0, y: 0, width:width, height: 64) 

    let backBtn = tempView.back as UIButton 
    let naviTitle = tempView.naviTitle as UILabel 
    let bell = tempView.bell as UIButton 
    let order = tempView.order as UIButton 

我需要爲backBtn,naviTitle,bell,order設置約束。我設置約束這樣

let views = ["backBtn": backBtn, 
       "naviTitle": naviTitle, 
       "order": order] as [String : AnyObject] 

    let iconVerticalConstraints = NSLayoutConstraint.constraints(
     withVisualFormat: "V:|-20-[backBtn(60)]", 
     options: [], 
     metrics: nil, 
     views: views) 
    allConstraints += iconVerticalConstraints 



    let nameLabelVerticalConstraints = NSLayoutConstraint.constraints(
     withVisualFormat: "V:|-23-[naviTitle]", 
     options: [], 
     metrics: nil, 
     views: views) 
    allConstraints += nameLabelVerticalConstraints 



    let skipButtonVerticalConstraints = NSLayoutConstraint.constraints(
     withVisualFormat: "V:|-20-[order]", 
     options: [], 
     metrics: nil, 
     views: views) 
    allConstraints += skipButtonVerticalConstraints 



    let welcomeHorizontalConstraints = NSLayoutConstraint.constraints(
     withVisualFormat: "H:|[backBtn]-5-[naviTitle]-5-[order]|", 
     options: [], 
     metrics: nil, 
     views: views) 
    allConstraints += welcomeHorizontalConstraints 


    let topRowHorizontalConstraints = NSLayoutConstraint.constraints(
     withVisualFormat: "H:|-15-[backBtn(60)]-[naviTitle]-[order]-15-|", 
     options: [.alignAllCenterY], 
     metrics: nil, 
     views: views) 
    allConstraints += topRowHorizontalConstraints 


    NSLayoutConstraint.activate(allConstraints) 

但它不會工作

回答

0

起初我想你必須禁用自動尺寸掩蓋

backBtn.translatesAutoresizingMaskIntoConstraints = false 
naviTitle.translatesAutoresizingMaskIntoConstraints = false 
bell.translatesAutoresizingMaskIntoConstraints = false 
order.translatesAutoresizingMaskIntoConstraints = false 

然後修復約束那些不能滿足同時

"H:|[backBtn]-5-[naviTitle]-5-[order]|" 
"H:|-15-[backBtn(60)]-[naviTitle]-[order]-15-|" 

你的backBtn與superview的距離不能同時爲0和15 ,這些約束的其餘部分也是如此。