以编程方式添加约束不尊重优先级
Adding constraints programmatically is not respecting priority
下面是一个将视图添加到父视图的循环。每个子视图都是左侧的删除按钮和信息.....它们位于父视图中...
每个子视图都被限制在上面的视图中……顶视图被限制在父视图的顶部边缘……所有这些都是以编程方式添加的。
删除按钮一次删除一个
一旦我向每个视图添加次要顶部约束以说明删除,我就会得到以下结果....
var horizontalConstraint1 = NSLayoutConstraint()
var horizontalConstraint2 = NSLayoutConstraint()
var verticalConstraint1 = NSLayoutConstraint()
var verticalConstraintOuter = NSLayoutConstraint()
horizontalConstraint1 = v.leadingAnchor.constraint(equalTo: (v.superview?.leadingAnchor)!,constant:10)
horizontalConstraint2 = v.trailingAnchor.constraint(equalTo: (v.superview?.trailingAnchor)!,constant:-10)
if self.prevView == nil{
verticalConstraint1 = v.topAnchor.constraint(equalTo: (v.superview?.topAnchor)!, constant: 0)
NSLayoutConstraint.activate([horizontalConstraint1,horizontalConstraint2,verticalConstraint1 ])
}else {
if let pv = self.prevView as? UIView {
verticalConstraint1 = v.topAnchor.constraint(equalTo: (pv.bottomAnchor), constant: 10)
verticalConstraintOuter = v.topAnchor.constraint(equalTo: (v.superview?.topAnchor)!,constant:10 )
verticalConstraintOuter.priority = UILayoutPriority(rawValue: 800)
NSLayoutConstraint.activate([horizontalConstraint1,horizontalConstraint2,verticalConstraint1,verticalConstraintOuter])
}
}
self.prevView = v
你的技术有问题。您不添加 "secondary top constraint to each view to account for the deleting"。删除视图时,您将完全删除现有约束并创建一组全新的约束。
或者,使用 UIStackView,它为您完成工作:您将排列视图的 isHidden
设置为 true
,堆栈视图重写其排列视图的约束。
对于您的情况,一种更简单的技术是使您的界面成为 UITableView。现在您所要做的就是删除一行 table。 "delete this row" 的概念基本上内置于 table 视图中;您几乎可以免费获得它(包括删除按钮,尽管没有法律规定您必须使用它)。
下面是一个将视图添加到父视图的循环。每个子视图都是左侧的删除按钮和信息.....它们位于父视图中...
每个子视图都被限制在上面的视图中……顶视图被限制在父视图的顶部边缘……所有这些都是以编程方式添加的。
删除按钮一次删除一个
一旦我向每个视图添加次要顶部约束以说明删除,我就会得到以下结果....
var horizontalConstraint1 = NSLayoutConstraint()
var horizontalConstraint2 = NSLayoutConstraint()
var verticalConstraint1 = NSLayoutConstraint()
var verticalConstraintOuter = NSLayoutConstraint()
horizontalConstraint1 = v.leadingAnchor.constraint(equalTo: (v.superview?.leadingAnchor)!,constant:10)
horizontalConstraint2 = v.trailingAnchor.constraint(equalTo: (v.superview?.trailingAnchor)!,constant:-10)
if self.prevView == nil{
verticalConstraint1 = v.topAnchor.constraint(equalTo: (v.superview?.topAnchor)!, constant: 0)
NSLayoutConstraint.activate([horizontalConstraint1,horizontalConstraint2,verticalConstraint1 ])
}else {
if let pv = self.prevView as? UIView {
verticalConstraint1 = v.topAnchor.constraint(equalTo: (pv.bottomAnchor), constant: 10)
verticalConstraintOuter = v.topAnchor.constraint(equalTo: (v.superview?.topAnchor)!,constant:10 )
verticalConstraintOuter.priority = UILayoutPriority(rawValue: 800)
NSLayoutConstraint.activate([horizontalConstraint1,horizontalConstraint2,verticalConstraint1,verticalConstraintOuter])
}
}
self.prevView = v
你的技术有问题。您不添加 "secondary top constraint to each view to account for the deleting"。删除视图时,您将完全删除现有约束并创建一组全新的约束。
或者,使用 UIStackView,它为您完成工作:您将排列视图的 isHidden
设置为 true
,堆栈视图重写其排列视图的约束。
对于您的情况,一种更简单的技术是使您的界面成为 UITableView。现在您所要做的就是删除一行 table。 "delete this row" 的概念基本上内置于 table 视图中;您几乎可以免费获得它(包括删除按钮,尽管没有法律规定您必须使用它)。