Ios 在自动布局中将视图动态移动到新位置
我有一个自定义的Ios 在自动布局中将视图动态移动到新位置,ios,swift,autolayout,uilabel,Ios,Swift,Autolayout,Uilabel,我有一个自定义的UITableViewCell布局,如下所示。它有三个标签 标签2是可选的。并不是每个细胞都有。所以我想隐藏它,并将标签1向下移动一点,以便在这种情况下与标签3对齐 以下是我为每个标签添加的约束 标签1 标签2 标签3 请注意,我添加了一个额外的约束,将中心与Y对齐,值为0到标签1,并将其优先级设置为750。我想,如果我删除标签2,优先级较低的约束将取而代之并向下移动 class TableViewController: UITableViewController {
UITableViewCell
布局,如下所示。它有三个标签
标签2是可选的。并不是每个细胞都有。所以我想隐藏它,并将标签1向下移动一点,以便在这种情况下与标签3对齐
以下是我为每个标签添加的约束
标签1
标签2
标签3
请注意,我添加了一个额外的约束,将中心与Y对齐,值为0到标签1,并将其优先级设置为750。我想,如果我删除标签2,优先级较低的约束将取而代之并向下移动
class TableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - Table view data source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell
if indexPath.row == 1 {
cell.label2.removeFromSuperview()
cell.updateConstraints()
}
return cell
}
}
但它似乎不起作用标签2已移除,但标签1的位置仍然相同
我怎样才能完成我所追求的
尝试#1 根据下面的T先生,我在标签1上添加了一个顶部约束。然后在
cellforrowatinexpath
方法中,我更改了它的值
override func tableView(tableView: UITableView, cellForRowAtIndexPath
indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell
if indexPath.row == 1 {
cell.label2.removeFromSuperview()
cell.topConstraint.constant = cell.bounds.height / 2
cell.layoutIfNeeded()
}
return cell
}
但这也不起作用。尝试为标签1的顶部约束设置一个出口。移除标签2时,更新标签1的顶部约束,即container.height/2,或移除顶部约束,并为标签1提供中心约束。如果需要,在更新约束条件后进行布局。我对您的方式印象非常深刻,因为如果我必须完成的话,我会遵循完全相同的步骤:) 现在我的建议是: 删除您添加的不起任何作用的额外“将中心与Y对齐,值为0的标签1:) 我可以看到你已经有了一个对齐中心y与一些偏移我相信-13标签1。为其创建一个iboutlet:)让我们将其名称命名为centerLabel1Constraint:) 每当您要将标签1置于中心位置时,隐藏标签2并将centerLabel1Constraint.constant设置为0并调用[cell LayoutIfNeed] 这应该可以完成任务:)
快乐编码:)我找到了一种方法,利用
NSLayoutConstraint
的新active
属性来实现这一点,如本文所述
我对值为-13的对齐中心Y约束进行了IBOutlet
。从中删除了弱
关键字
然后在cellforrowatinexpath
方法中,我只需切换active
属性的值
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell
if indexPath.row % 2 == 0 {
cell.label2.hidden = true
cell.oldConstraint.active = false
} else {
cell.label2.hidden = false
cell.oldConstraint.active = true
}
return cell
}
试穿一下
需要的布局
?@zcui93刚刚试过。没有变化。我注意到标签1的CentreY
约束都针对superview
,第二个约束是否应该与标签2相关?标签放在哪里?在cell contentview中还是在cell自定义uiview中?@Mr.T在cell contentview中。只是尝试一下。但不幸的是,它似乎不起作用。更新了问题。感谢您的回复。我试过这个。它起作用,但只是部分起作用。问题是,对于标签为2的单元格,无法确定常量的值,因为一旦将其设置为0,当单元格被重用时,它就会被重用。您已经知道常量值了吗???我的意思是,当您想要显示label2时,只需使其可见,并将centerLabel1Constraint.constant的值设置回-13,并在摘要中调用[cell LayoutFneed]:indexpath处的行的单元格看起来像是(条件:show label2){centerLabel1Constraint.constant=-13;label2.Hidden=NO;[cell LayoutFneed]}els{{centerLabel1Constraint.constant=0;label2.Hidden=YES;[cell layoutifneed]}不是吗???:)问题是我不喜欢硬编码值-13。因为这些单元格是自动调整大小的。无论如何,我找到了一种方法。我发布了它。谢谢你的帮助。硬编码-13不会有任何区别,伙计:)因为它总是从中心减去y值,而y值是根据o动态计算的n单元格的高度:)因此,无论您的单元格大小如何,它始终显示在垂直中心线上方13个像素:)这就是苹果提供恒定概念的目的:)无论如何,很高兴您找到了解决方案:)我仍然认为这不是最好的解决方案。由于标签具有固有的大小,因此应该有一个只有通过将标签文本设置为零才能实现此目的。我们将在明天检查并给出答案