iOS Swift在TableView Cell中添加两个视图for for循环
我最近在新项目上工作,我需要在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):
我想这个问题是关于约束两者之间view.How我管理呢?
谢谢你们
编辑: 室高度为汽车(UITableViewAutomaticDimension)
你是正确的,你需要两个子视图之间的约束。
使用自动布局来确定视图的高度需要在视图的顶部和底部之间有清晰的约束链。这可以像一个视图上的单个高度约束一样简单,就是子视图之间的一系列约束。
这是您当前从上到下对你的细胞的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)
谢谢你,它为我工作 – MohammadReza
退房框架X位置
我觉得你有问题
reviewView.frame = CGRectMake(0,71, cell.contentView.frame.size.width,71)
变化
reviewView.frame = CGRectMake(200,0, cell.contentView.frame.size.width,71)
以自定义UITableViewCell代替以编程方式进行。在自定义的UITableViewCell中,您可以直接在故事板文件中给出约束。
什么是您的ReviewView框架? – Sofeda
你的细胞高度是多少?是71 * 2? – Sofeda
@SMi它的UITableViewAutomaticDimension(自动高度)和ReviewView是我xib的自定义视图 – MohammadReza