以编程方式将约束添加到UIView

问题描述:

我没有做很多的UI编程,但我有一个UIView,我想UILabel被约束到UIView的左上角,然后有另一个约束到右上角这次。我完全意识到如何在GUI上做到这一点,但我想知道如何纯粹通过swift/programatically来实现这一点。多谢你们。以编程方式将约束添加到UIView

+2

[NSLayoutConstraint](https://developer.apple.com/documentation/appkit/nslayoutconstraint)和[自动布局指南(https://developer.apple.com/图书馆/内容/文档/用户体验/概念/ AutolayoutPG /以编程方式创建Constraints.html)是你的朋友。 – paulvs

这是用NSLayoutConstraint类完成的。

首先,添加标签为子视图:

let label = UILabel() 
label.translatesAutoresizingMaskIntoConstraints = false 

view.addSubview(label) 

这是我为了方便地添加约束子视图扩展。这里的主要方法为你学习是func pin(firstSubview subview1:UIView, firstEdge edge1:NSLayoutAttribute, secondSubview subview2:UIView, secondEdge edge2:NSLayoutAttribute, with constant:Float)

 extension UIView { 
      func pinSubview(_ subview:UIView, toEdge edge:NSLayoutAttribute, withConstant constant:Float) { 
      self.pinSubviews(self, subview2: subview, toEdge: edge, withConstant: constant) 
      } 

      func pinSubviews(_ subview1:UIView, subview2:UIView, toEdge edge:NSLayoutAttribute, withConstant constant:Float) { 
      pin(firstSubview: subview1, firstEdge: edge, secondSubview: subview2, secondEdge: edge, with: constant) 
      } 

      func pin(firstSubview subview1:UIView, firstEdge edge1:NSLayoutAttribute, secondSubview subview2:UIView, secondEdge edge2:NSLayoutAttribute, with constant:Float) { 
      let constraint = NSLayoutConstraint(item: subview1, attribute: edge1, relatedBy: .equal, toItem: subview2, attribute: edge2, multiplier: 1, constant: CGFloat(constant)) 
      self.addConstraint(constraint) 
      } 

      func pinSubview(_ subview:UIView, withHeight height:CGFloat) { 
      let height = NSLayoutConstraint(item: subview, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: height) 
      self.addConstraint(height) 
      } 

      func pinSubview(_ subview:UIView, withWidth width:CGFloat) { 
      let width = NSLayoutConstraint(item: subview, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: width) 
      self.addConstraint(width) 
      }   
    } 

然后你有非常简单的用法:

self.view.pinSubview(label, toEdge: .left, withConstant: 0) 
self.view.pinSubview(label, toEdge: .top, withConstant: 0) 

看看下面的代码以供参考以编程方式添加约束在一个视图

let containerView = UIView() 
     containerView.translatesAutoresizingMaskIntoConstraints = false 

     view.addSubview(containerView) 

     //ios9 constraint anchors 
     //x,y,w,h 
     containerView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true 
     containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true 
     containerView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true 
     containerView.heightAnchor.constraint(equalToConstant: 50).isActive = true 

     let sendButton = UIButton(type: .system) 
     sendButton.setTitle("Send", for: UIControlState()) 
     sendButton.translatesAutoresizingMaskIntoConstraints = false 
     sendButton.addTarget(self, action: #selector(handleSend), for: .touchUpInside) 
     containerView.addSubview(sendButton) 
     //x,y,w,h 
     sendButton.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true 
     sendButton.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true 
     sendButton.widthAnchor.constraint(equalToConstant: 80).isActive = true 
     sendButton.heightAnchor.constraint(equalTo: containerView.heightAnchor).isActive = true 

     containerView.addSubview(inputTextField) 
     //x,y,w,h 
     inputTextField.leftAnchor.constraint(equalTo: containerView.leftAnchor, constant: 8).isActive = true 
     inputTextField.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true 
     inputTextField.rightAnchor.constraint(equalTo: sendButton.leftAnchor).isActive = true 
     inputTextField.heightAnchor.constraint(equalTo: containerView.heightAnchor).isActive = true 

这是编程式添加约束到UIView的一种方法()

override func viewDidLoad() { 
      super.viewDidLoad() 

let centerView = UIView() 
     centerView.translatesAutoresizingMaskIntoConstraints = false 
     centerView.backgroundColor = UIColor.brown 
     view.addSubview(centerView) 

     let centerViewhorizontalConstraint = NSLayoutConstraint(item: centerView, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0) 

     let centerViewverticalConstraint = NSLayoutConstraint(item: centerView, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerY, multiplier: 0.90, constant: 0) 

     let centerViewwidthConstraint = NSLayoutConstraint(item: centerView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 300) 

     let centerViewheightConstraint = NSLayoutConstraint(item: centerView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant:300) 

     NSLayoutConstraint.activate([centerViewhorizontalConstraint, centerViewverticalConstraint, centerViewwidthConstraint, centerViewheightConstraint]) 

} 

enter image description here