swift - 未遵守程序约束

标签 swift constraints nslayoutconstraint

我在按下按钮时运行下面的代码,但是似乎没有遵守底部约束。 subview (bandCardView)溢出父 View (formVw)的底部。我怎样才能让这些约束得到遵守?

 @objc private func cardBtnTouch(){
        self.bandAccountView?.bankBtn.setSelected(selected: false)
        self.bandAccountView?.cardBtn.setSelected(selected: true)

        self.bandAccountView?.selectLbl.isHidden = true
        for subview in self.bandAccountView!.formVw.subviews{
            subview.removeFromSuperview()
        }
        self.bandAccountView!.formVw.addSubview(bandCardView!)
        self.bandAccountView!.formVw.addConstraint(NSLayoutConstraint(item: self.bandAccountView!.formVw, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: bandCardView!, attribute: NSLayoutAttribute.top, multiplier: 1.0, constant: 0.0))
        self.bandAccountView!.formVw.addConstraint(NSLayoutConstraint(item: bandCardView!, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, toItem: self.bandAccountView!.formVw, attribute: NSLayoutAttribute.bottom, multiplier: 1.0, constant: 0.0))
        self.bandAccountView!.formVw.addConstraint(NSLayoutConstraint(item: bandCardView!, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: self.bandAccountView!.formVw, attribute: NSLayoutAttribute.leading, multiplier: 1.0, constant: 0.0))
        self.bandAccountView!.formVw.addConstraint(NSLayoutConstraint(item: self.bandAccountView!.formVw, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: bandCardView!, attribute: NSLayoutAttribute.trailing, multiplier: 1.0, constant: 0.0))
    }

最佳答案

确保您已将 translatesAutoresizingMaskIntoConstraints 设置为 false

在 iOS 9 之后还有一个 easier way编写约束。

添加没有任何常量的单个约束:

self.bandAccountView!.formVw.addConstraint(formVw.topAnchor.constraint(equalTo:
 bandCardView.topAnchor)

添加带有常量的单个约束:

self.bandAccountView!.formVw.addConstraint(formVw.topAnchor.constraint(equalTo: 
bandCardView.topAnchor, constant: 10)

添加多个约束:

self.bandAccountView!.formVw.addConstraints([formVw.topAnchor.constraint(equalTo:
 bandCardView.topAnchor),formVw.bottomAnchor.constraint(equalTo:
 bandCardView.bottomAnchor),formVw.leadingAnchor.constraint(equalTo: 
 bandCardView.leadingAnchor),formVw.trailingAnchor.constraint(equalTo:
 bandCardView.trailingAnchor)]

注意:

如果你曾经写过:

self.bandAccountView!.formVw.leadingAnchor.constraint(equalTo:
formVw.leadingAnchor, constant: 0)

那么你实际上忘记了“添加/激活约束”。要修复它,您要么必须这样做:

self.bandAccountView!.formVw.leadingAnchor.constraint(equalTo:
formVw.leadingAnchor, constant: 0).isActive = true

let leadingConstraint = self.bandAccountView!.formVw.leadingAnchor.constraint(equalTo:
formVw.leadingAnchor, constant: 0)
leadingConstraint.isActive = true // do this whenever you need
leadingConstraint.isActive = false // if you don't need it...

或者只是喜欢第一个片段


此外,bandAccountViewformVw 之间的关系是实例 - 实例变量,您这样做的方式并不好。最好在它自己的类中进行约束,或者创建一个自定义初始化程序,它只会为您调整常量

关于swift - 未遵守程序约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44074872/

相关文章:

iphone - 将 NSLayoutConstraints 应用于 UIView 子类

swift - 可选地转换为 Type 是 Swift 中的类类型的变量

inheritance - 如何继承odoo v8上的_constraints?

swift - 如何使 View Controller 扩展以适应较小屏幕上的布局?

ios - 固定高度 subview 的自动布局约束警告

ios - 带 anchor 的自动布局边距

ios - 翻转图像以供按钮使用

ios - 同时使用滑动手势和触摸开始/移动/结束

swift - 如何将 UINavigationbar 中的按钮移动到右侧

Objective-C UIScrollView 约束