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中,您可以直接在故事板文件中给出约束。