enum Constraint : String { case top = "topAnchor" case bottom = "bottomAnchor" case right = "rightAnchor" case left = "leftAnchor" case centerX = "centerXAnchor" case centerY = "centerYAnchor" } extension UIView { func constraintLeft(toLeft of: UIView, margin: CGFloat = 0) { self.deleteConstraints(.left) print(self.constraints) // prints [] let left = leftAnchor.constraint(equalTo: of.leftAnchor, constant: margin) left.identifier = Constraint.left.rawValue NSLayoutConstraint.activate([left]) setNeedsUpdateConstraints() print(self.constraints) // prints [] } /* Other functions left out */ func constraintLeft(toRight of: UIView, margin: CGFloat = 0) { self.deleteConstraints(.left) print(self.constraints) // prints [] let left = leftAnchor.constraint(equalTo: of.rightAnchor, constant: margin) left.identifier = Constraint.left.rawValue NSLayoutConstraint.activate([left]) setNeedsUpdateConstraints() print(self.constraints) // prints [] } func constraintCenterVertical(to of: UIView) -> Void { self.deleteConstraints(.centerY) print(self.constraints) // prints [] let cy = centerYAnchor.constraint(equalTo: of.centerYAnchor) cy.identifier = Constraint.centerY.rawValue NSLayoutConstraint.activate([cy]) setNeedsUpdateConstraints() print(self.constraints) // prints [] } func deleteConstraints(_ constraintsToRemove: Constraint...) { self.removeConstraints(self.constraints.filter({ c in guard c.identifier != nil else { return false } return constraintsToRemove.contains { constraint in constraint.rawValue.elementsEqual(c.identifier!) } })) } } class CustomConstraintsViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let btn = createButton(icon: "cc", label: "Test") view.addSubview(btn) let g = view.safeAreaLayoutGuide NSLayoutConstraint.activate([ btn.topAnchor.constraint(equalTo: g.topAnchor, constant: 80.0), btn.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 80.0), btn.widthAnchor.constraint(equalToConstant: 240.0), //btn.heightAnchor.constraint(equalToConstant: 120.0), ]) btn.backgroundColor = .systemYellow btn.constraints.forEach { c in print("create button view:", c) } var i = 0 btn.subviews.forEach { v in i += 1 v.constraints.forEach { c in print("subview:", i, c) } } } func createButton(icon: String, label: String) -> UIView { let button = UIView() // TransparentCardView() button.translatesAutoresizingMaskIntoConstraints = false let uiImageView = UIImageView(image: UIImage(named: icon)) button.addSubview(uiImageView) uiImageView.translatesAutoresizingMaskIntoConstraints = false uiImageView.constraintCenterVertical(to: button) // works uiImageView.constraintLeft(toLeft: button, margin: 24.0) // this does not work //uiImageView.leftAnchor.constraint(equalTo: button.leftAnchor, constant: 24.0).isActive = true // this does let textView = UILabel() textView.backgroundColor = .cyan button.addSubview(textView) textView.translatesAutoresizingMaskIntoConstraints = false textView.constraintCenterVertical(to: button) // works textView.constraintLeft(toRight: uiImageView,margin: 0) // This does not work! //textView.leftAnchor.constraint(equalTo: uiImageView.rightAnchor,constant: 20.0).isActive = true // this does work! textView.heightAnchor.constraint(equalToConstant: 90.0).isActive = true textView.widthAnchor.constraint(equalToConstant: 120.0).isActive = true button.heightAnchor.constraint(equalToConstant: 160.0).isActive = true return button } }