代码之家  ›  专栏  ›  技术社区  ›  BostonMacOSX

以编程方式添加约束不符合优先级

  •  0
  • BostonMacOSX  · 技术社区  · 7 年前

    下面是向superview添加视图的循环。每个子视图都是左侧的删除按钮和信息。。。。。他们坐在父视图中。。。

    每个子视图都约束到上面的视图。。。并且俯视图被约束到父视图的上边缘。。全部按程序添加。

    “删除”按钮将一次删除一个

    The fine version where I dont add the secondary priority 800 top anchor

    一旦我为每个视图添加了一个次要的顶部约束来解释删除,那么我会得到以下结果。。。。

    enter image description here

    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 
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   matt    7 年前

    你的技术是错误的。您不需要向每个视图添加“次要顶部约束以解释删除”。删除视图时,将完全删除现有约束并创建一组全新的约束。

    或者,使用UIStackView,它可以为您完成以下工作:设置排列视图的 isHidden true 堆栈视图重写其排列视图的约束。

    在您的情况下,一种更简单的技术是将您的界面设置为UITableView。现在您所要做的就是删除表中的一行。“删除此行”的概念基本上构建在表视图中;你几乎可以免费获得它(包括一个删除按钮,尽管没有法律规定你必须使用它)。