我最近在新项目上工作,我需要在TableViewController的一个单元格中添加两个自定义视图。像这样:
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
我猜问题出在两个视图之间的约束上,我该如何处理?
谢谢你们
编辑:
像元高度是自动的(UITableViewAutomaticDimension)
最佳答案
您是正确的,您需要在两个子视图之间进行约束。
使用自动布局确定视图的高度要求在视图的顶部和底部之间有清晰的约束链。这可以像视图上的单个高度约束到子视图之间的一系列约束一样简单。
这是单元格contentView
上从上到下的当前约束链:|-[v0]
:这将第一个视图的.Top
限制为.Top
的contentView
[v0(71)]
:这是告诉视图的高度为71
(或另一种思考方式是,告诉视图的.Bottom
为71
指向其.Top
向下的位置[v0(71)]
(第二个循环):告诉第二个视图具有71
的高度,类似于第一个视图[v0]-|
:这将第二个视图的.Bottom
限制为.Bottom
的contentView
缺少的部分位于第一个视图的.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)
关于ios - iOS Swift使用for循环在TableView单元格中添加两个 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39015533/