2016-08-18 111 views
0

我最近在新項目上工作,我需要在TableViewController中的一個單元格中添加兩個自定義視圖。像這樣:iOS Swift在TableView Cell中添加兩個視圖for for循環

if indexPath.row == 4 { 

     for index in 0..<2 { 

      let reviewView = ReviewView() 
      reviewView.translatesAutoresizingMaskIntoConstraints = false 


      cell.addSubview(reviewView) 
      cell.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[v0]-|",options: [],metrics: nil,views: ["v0" : reviewView])) 

      if index == 0 { 

       cell.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[v0(71)]",options: [],metrics: nil,views:["v0" : reviewView])) 
       reviewView.backgroundColor = UIColor.redColor() 
       reviewView.frame = CGRectMake(0, 0, cell.contentView.frame.size.width, 71) 
      } 
      if index == 1 { 
       cell.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[v0(71)]-|",options: [],metrics: nil,views:["v0" : reviewView])) 
       reviewView.backgroundColor = UIColor.blueColor() 
       reviewView.frame = CGRectMake(0, 71, cell.contentView.frame.size.width, 71) 
      } 


      print(index) 
     } 

     return cell 

    } 

但結果是這樣的(兩個視圖的高度必須等於和71):

Simulator Result

我想這個問題是關於約束兩者之間view.How我管理呢?

謝謝你們

編輯: 室高度爲汽車(UITableViewAutomaticDimension)

+0

什麼是您的ReviewView框架? – Sofeda

+0

你的細胞高度是多少?是71 * 2? – Sofeda

+0

@SMi它的UITableViewAutomaticDimension(自動高度)和ReviewView是我xib的自定義視圖 – MohammadReza

回答

0

你是正確的,你需要兩個子視圖之間的約束。

使用自動佈局來確定視圖的高度需要在視圖的頂部和底部之間有清晰的約束鏈。這可以像一個視圖上的單個高度約束一樣簡單,就是子視圖之間的一系列約束。

這是您當前從上到下對你的細胞的contentView約束鏈:

|-[v0]:這是制約第一視圖的.Top到的contentView

[v0(71)].Top:這是告訴該視圖有一個高度71(或另一種方式來思考它是它是告訴視圖的.Bottom是從.Top下降71

[v0(71)](第二循環):這是告訴第二視圖以具有71的高度,類似於第一

[v0]-|:這限制了第二視圖的.Bottom到的contentView

該缺少的部分的.Bottom介於第一個視圖的.Bottom和第二個視圖的.Top之間。

與您現有的代碼來解決,這將是保持第一視圖的軌道,並保持約束之間是.Bottom和第二視圖的.Top,這樣最簡單的方法:

if indexPath.row == 4 { 

    var lastReviewView:ReviewView?; 
    for index in 0..<2 { 

     let reviewView = ReviewView() 
     reviewView.translatesAutoresizingMaskIntoConstraints = false 


     cell.addSubview(reviewView) 
     cell.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[v0]-|",options: [],metrics: nil,views: ["v0" : reviewView])) 

     if index == 0 { 

      cell.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[v0(71)]",options: [],metrics: nil,views:["v0" : reviewView])) 
      reviewView.backgroundColor = UIColor.redColor() 
     } 
     if index == 1 { 
      cell.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[v0(71)]-|",options: [],metrics: nil,views:["v0" : reviewView])) 
      reviewView.backgroundColor = UIColor.blueColor() 
     } 

     if (lastReviewView != nil) { 
      cell.contentView.addConstraint(NSLayoutConstraint(item: lastReviewView!, attribute: .Bottom, relatedBy: .Equal, toItem: reviewView, attribute: .Top, multiplier: 1.0, constant: 0.0)) 
     } 

     lastReviewView = reviewView 
     print(index) 
    } 

    return cell 

} 

如果您正在尋找要處理彼此堆疊的可變數量的視圖,您可以這樣做:

var reviewViews:[ReviewView] = [] // Fill this out with your loop 
let contentView = cell.contentView 
    var constraints:[NSLayoutConstraint] = [] 

let firstView = reviewViews.first 
constraints.append(NSLayoutConstraint(item: contentView, attribute: .Top, relatedBy: .Equal, toItem: firstView, attribute: .Top, multiplier: 1.0, constant: 0.0)) 

for i in 0..<reviewViews.count { 

    let view = reviewViews[i] 
    constraints.append(NSLayoutConstraint(item: view, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 71.0)) 

    if i > 0 { 
     let lastView = reviewViews[i-1] 
     constraints.append(NSLayoutConstraint(item: lastView, attribute: .Bottom, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1.0, constant: 0.0)) 
    } 

} 

let lastView = reviewViews.last 
constraints.append(NSLayoutConstraint(item: contentView, attribute: .Bottom, relatedBy: .Equal, toItem: lastView, attribute: .Bottom, multiplier: 1.0, constant: 0.0)) 

NSLayoutConstraint.activateConstraints(constraints) 
+0

謝謝你,它爲我工作 – MohammadReza

0

您約束到內容查看添加細胞不是直接到小區

+0

不工作。結果 – MohammadReza

0

退房框架X位置

我覺得你有問題

reviewView.frame = CGRectMake(0,71, cell.contentView.frame.size.width,71)

變化

reviewView.frame = CGRectMake(200,0, cell.contentView.frame.size.width,71)

0

以自定義UITableViewCell代替以編程方式進行。在自定義的UITableViewCell中,您可以直接在故事板文件中給出約束。