Как добавить ограничения программно с помощью Swift

Я пытаюсь понять это с прошлой недели, не продвинувшись дальше. Хорошо, поэтому мне нужно применить некоторые ограничения программно в Swift к UIView используя этот код:

 var new_view:UIView! = UIView(frame: CGRectMake(0, 0, 100, 100)); new_view.backgroundColor = UIColor.redColor(); view.addSubview(new_view); var constX:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0); self.view.addConstraint(constX); var constY:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0); self.view.addConstraint(constY); var constW:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0); self.view.addConstraint(constW); var constH:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Height, multiplier: 1, constant: 0); self.view.addConstraint(constH); 

Но Xcode возвращает этот странный вывод:

 2014-10-03 09:48:12.657 Test[35088:2454916] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) ( "", "", "", "" ) Will attempt to recover by breaking constraint  Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in  may also be helpful. 2014-10-03 09:48:12.658 Test[35088:2454916] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) ( "", "", "", "" ) Will attempt to recover by breaking constraint  Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in  may also be helpful. 

Вы можете мне помочь? большое спасибо

Планируете ли вы иметь квадрат UIView ширины: 100 и Height: 100 в центре UIView UIViewController ? Если это так, вы можете попробовать один из 6 следующих стилей Auto Layout (Swift 4 / iOS 11):


1. Использование инициализатора NSLayoutConstraint

 override func viewDidLoad() { let newView = UIView() newView.backgroundColor = UIColor.red view.addSubview(newView) newView.translatesAutoresizingMaskIntoConstraints = false let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0) let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerY, multiplier: 1, constant: 0) let widthConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100) let heightConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100) view.addConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint]) } 
 override func viewDidLoad() { let newView = UIView() newView.backgroundColor = UIColor.red view.addSubview(newView) newView.translatesAutoresizingMaskIntoConstraints = false let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0) let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerY, multiplier: 1, constant: 0) let widthConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100) let heightConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100) NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint]) } 
 override func viewDidLoad() { let newView = UIView() newView.backgroundColor = UIColor.red view.addSubview(newView) newView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0).isActive = true NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerY, multiplier: 1, constant: 0).isActive = true NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100).isActive = true NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100).isActive = true } 

2. Использование языка Visual Format

 override func viewDidLoad() { let newView = UIView() newView.backgroundColor = UIColor.red view.addSubview(newView) newView.translatesAutoresizingMaskIntoConstraints = false let views = ["view": view!, "newView": newView] let horizontalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:[view]-(<=0)-[newView(100)]", options: NSLayoutFormatOptions.alignAllCenterY, metrics: nil, views: views) let verticalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:[view]-(<=0)-[newView(100)]", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: views) view.addConstraints(horizontalConstraints) view.addConstraints(verticalConstraints) } 
 override func viewDidLoad() { let newView = UIView() newView.backgroundColor = UIColor.red view.addSubview(newView) newView.translatesAutoresizingMaskIntoConstraints = false let views = ["view": view!, "newView": newView] let horizontalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:[view]-(<=0)-[newView(100)]", options: NSLayoutFormatOptions.alignAllCenterY, metrics: nil, views: views) let verticalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:[view]-(<=0)-[newView(100)]", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: views) NSLayoutConstraint.activate(horizontalConstraints) NSLayoutConstraint.activate(verticalConstraints) } 

3. Использование сочетания инициализатора NSLayoutConstraint и языка Visual Format

 override func viewDidLoad() { let newView = UIView() newView.backgroundColor = UIColor.red view.addSubview(newView) newView.translatesAutoresizingMaskIntoConstraints = false let views = ["newView": newView] let widthConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:[newView(100)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views) let heightConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:[newView(100)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views) let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0) let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerY, multiplier: 1, constant: 0) view.addConstraints(widthConstraints) view.addConstraints(heightConstraints) view.addConstraints([horizontalConstraint, verticalConstraint]) } 
 override func viewDidLoad() { let newView = UIView() newView.backgroundColor = UIColor.red view.addSubview(newView) newView.translatesAutoresizingMaskIntoConstraints = false let views = ["newView": newView] let widthConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:[newView(100)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views) let heightConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:[newView(100)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views) let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0) let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerY, multiplier: 1, constant: 0) NSLayoutConstraint.activate(widthConstraints) NSLayoutConstraint.activate(heightConstraints) NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint]) } 
 override func viewDidLoad() { let newView = UIView() newView.backgroundColor = UIColor.red view.addSubview(newView) newView.translatesAutoresizingMaskIntoConstraints = false let views = ["newView": newView] let widthConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:[newView(100)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views) let heightConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:[newView(100)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views) NSLayoutConstraint.activate(widthConstraints) NSLayoutConstraint.activate(heightConstraints) NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0).isActive = true NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerY, multiplier: 1, constant: 0).isActive = true } 

4. Использование UIViewAutoresizing

Примечание. Спрингс и Struts будут переведены на соответствующие ограничения макета во время выполнения.

 override func viewDidLoad() { let newView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) newView.backgroundColor = UIColor.red view.addSubview(newView) newView.translatesAutoresizingMaskIntoConstraints = true newView.center = CGPoint(x: view.bounds.midX, y: view.bounds.midY) newView.autoresizingMask = [UIViewAutoresizing.flexibleLeftMargin, UIViewAutoresizing.flexibleRightMargin, UIViewAutoresizing.flexibleTopMargin, UIViewAutoresizing.flexibleBottomMargin] } 

5. Использование NSLayoutAnchor

 override func viewDidLoad() { let newView = UIView() newView.backgroundColor = UIColor.red view.addSubview(newView) newView.translatesAutoresizingMaskIntoConstraints = false let horizontalConstraint = newView.centerXAnchor.constraint(equalTo: view.centerXAnchor) let verticalConstraint = newView.centerYAnchor.constraint(equalTo: view.centerYAnchor) let widthConstraint = newView.widthAnchor.constraint(equalToConstant: 100) let heightConstraint = newView.heightAnchor.constraint(equalToConstant: 100) view.addConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint]) } 
 override func viewDidLoad() { let newView = UIView() newView.backgroundColor = UIColor.red view.addSubview(newView) newView.translatesAutoresizingMaskIntoConstraints = false let horizontalConstraint = newView.centerXAnchor.constraint(equalTo: view.centerXAnchor) let verticalConstraint = newView.centerYAnchor.constraint(equalTo: view.centerYAnchor) let widthConstraint = newView.widthAnchor.constraint(equalToConstant: 100) let heightConstraint = newView.heightAnchor.constraint(equalToConstant: 100) NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint]) } 
 override func viewDidLoad() { let newView = UIView() newView.backgroundColor = UIColor.red view.addSubview(newView) newView.translatesAutoresizingMaskIntoConstraints = false newView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true newView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true newView.widthAnchor.constraint(equalToConstant: 100).isActive = true newView.heightAnchor.constraint(equalToConstant: 100).isActive = true } 

6. Использование intrinsicContentSize и NSLayoutAnchor

 import UIKit class CustomView: UIView { override var intrinsicContentSize: CGSize { return CGSize(width: 100, height: 100) } } class ViewController: UIViewController { override func viewDidLoad() { let newView = CustomView() newView.backgroundColor = UIColor.red view.addSubview(newView) newView.translatesAutoresizingMaskIntoConstraints = false let horizontalConstraint = newView.centerXAnchor.constraint(equalTo: view.centerXAnchor) let verticalConstraint = newView.centerYAnchor.constraint(equalTo: view.centerYAnchor) NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint]) } } 

Это помогает мне узнать визуально, так что это дополнительный ответ.

Код котла

 override func viewDidLoad() { super.viewDidLoad() let myView = UIView() myView.backgroundColor = UIColor.blue myView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(myView) // Add constraints code here // ... } 

Каждый из следующих примеров не зависит от других.

Задний левый край

myView.leading = leadingMargin + 20

введите описание изображения здесь

Метод 1: Якорный стиль

 let margins = view.layoutMarginsGuide myView.leadingAnchor.constraint(equalTo: margins.leadingAnchor, constant: 20).isActive = true 
  • В дополнение к leadingAnchor , есть также trailingAnchor , topAnchor и bottomAnchor .

Способ 2: стиль NSLayoutConstraint

 NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.leadingMargin, multiplier: 1.0, constant: 20.0).isActive = true 
  • В дополнение к .leading также есть .trailing , .top и .bottom .
  • В дополнение к .leadingMargin также есть .trailingMargin , .topMargin и .bottomMargin .

Установить ширину и высоту

width = 200
height = 100

введите описание изображения здесь

Метод 1: Якорный стиль

 myView.widthAnchor.constraint(equalToConstant: 200).isActive = true myView.heightAnchor.constraint(equalToConstant: 100).isActive = true 

Способ 2: стиль NSLayoutConstraint

 NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 200).isActive = true NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100).isActive = true 

Центр в контейнере

myView.centerX = centerX
myView.centerY = centerY

введите описание изображения здесь

Метод 1: Якорный стиль

 myView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true myView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 

Способ 2: стиль NSLayoutConstraint

 NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0).isActive = true NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerY, multiplier: 1, constant: 0).isActive = true 

Заметки

  • Якорный стиль является предпочтительным методом над NSLayoutConstraint Style, однако он доступен только для iOS 9, поэтому, если вы поддерживаете iOS 8, вам следует использовать стиль NSLayoutConstraint .
  • В приведенных выше примерах показано только одно или два ограничения, на которые основное внимание уделялось. Однако, чтобы правильно разместить myView в моем тестовом проекте, мне нужно было иметь четыре ограничения.

Дальнейшее чтение

  • Документация по программному созданию ограничений

Если вы хотите заполнить свой супер-просмотр, я предлагаю осторожный способ:

  view.translatesAutoresizingMaskIntoConstraints = false let attributes: [NSLayoutAttribute] = [.top, .bottom, .right, .left] NSLayoutConstraint.activate(attributes.map { NSLayoutConstraint(item: view, attribute: $0, relatedBy: .equal, toItem: view.superview, attribute: $0, multiplier: 1, constant: 0) }) 

Другое разумное, если вам нужны не равные ограничения, проверьте NSLayoutAnchor на iOS 9. Его часто намного легче читать, используя напрямую NSLayoutConstraint:

  view.translatesAutoresizingMaskIntoConstraints = false view.topAnchor.constraint(equalTo: view.superview!.topAnchor).isActive = true view.bottomAnchor.constraint(equalTo: view.superview!.bottomAnchor).isActive = true view.leadingAnchor.constraint(equalTo: view.superview!.leadingAnchor, constant: 10).isActive = true view.trailingAnchor.constraint(equalTo: view.superview!.trailingAnchor, constant: 10).isActive = true 

Проблема, как указывает сообщение об ошибке, заключается в том, что у вас есть ограничения типа NSAutoresizingMaskLayoutConstraints которые конфликтуют с вашими явными ограничениями, поскольку new_view.translatesAutoresizingMaskIntoConstraints имеет значение true.

Это значение по умолчанию для представлений, созданных в коде. Вы можете отключить его следующим образом:

 var new_view:UIView! = UIView(frame: CGRectMake(0, 0, 100, 100)) new_view.translatesAutoresizingMaskIntoConstraints = false 

Кроме того, ваши ограничения по ширине и высоте являются странными. Если вы хотите, чтобы представление имело постоянную ширину, это правильный способ:

 new_view.addConstraint(NSLayoutConstraint( item:new_view, attribute:NSLayoutAttribute.Width, relatedBy:NSLayoutRelation.Equal, toItem:nil, attribute:NSLayoutAttribute.NotAnAttribute, multiplier:0, constant:100)) 

(Замените 100 на ширину, которую вы хотите иметь.)

Если целью развертывания является iOS 9.0 или новее, вы можете использовать этот более короткий код:

 new_view.widthAnchor.constraintEqualToConstant(100).active = true 

Во всяком случае, для такого макета (фиксированный размер и центрированный в виде родительского элемента) было бы проще использовать маску авторезистирования и позволить системе переводить маску в ограничения:

 var new_view:UIView! = UIView(frame: CGRectMake(0, 0, 100, 100)) new_view.backgroundColor = UIColor.redColor(); view.addSubview(new_view); // This is the default setting but be explicit anyway... new_view.translatesAutoresizingMaskIntoConstraints = true new_view.autoresizingMask = [ .FlexibleTopMargin, .FlexibleBottomMargin, .FlexibleLeftMargin, .FlexibleRightMargin ] new_view.center = CGPointMake(view.bounds.midX, view.bounds.midY) 

Обратите внимание, что использование авторезистора совершенно законно, даже если вы также используете автозапуск. (UIKit по-прежнему использует авторезистирование во многих местах внутри.) Проблема заключается в том, что трудно применить дополнительные ограничения для представления, которое использует авторезистировку.

Автоматическая компоновка реализуется путем применения ограничений на изображения. Используйте NSLayoutConstraint. На всех устройствах можно реализовать идеальный и красивый дизайн. Пожалуйста, попробуйте код ниже.

 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let myImageView:UIImageView = UIImageView() myImageView.backgroundColor = UIColor.red myImageView.image = UIImage(named:"sample_dog")! myImageView.translatesAutoresizingMaskIntoConstraints = false myImageView.layer.borderColor = UIColor.red.cgColor myImageView.layer.borderWidth = 10 self.view.addSubview(myImageView) view.removeConstraints(view.constraints) view.addConstraint(NSLayoutConstraint( item: myImageView, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1, constant:100) ) view.addConstraint(NSLayoutConstraint( item: myImageView, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: 1, constant:0) ) view.addConstraint(NSLayoutConstraint( item: myImageView, attribute: .height, relatedBy: .equal, toItem: view, attribute: .width, multiplier: 0.5, constant:40)) view.addConstraint(NSLayoutConstraint( item: myImageView, attribute: .width, relatedBy: .equal, toItem: view, attribute: .width, multiplier: 0.5, constant:40)) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } 

введите описание изображения здесь введите описание изображения здесь

это немного отличается в xcode 7.3.1. это то, что я придумал

  // creating the view let newView = UIView() newView.backgroundColor = UIColor.redColor() newView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(newView) // creating the constraint // attribute and relation cannot be set directyl you need to create a cariable of them let layout11 = NSLayoutAttribute.CenterX let layout21 = NSLayoutRelation.Equal let layout31 = NSLayoutAttribute.CenterY let layout41 = NSLayoutAttribute.Width let layout51 = NSLayoutAttribute.Height let layout61 = NSLayoutAttribute.NotAnAttribute // defining all the constraint let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: layout11, relatedBy: layout21, toItem: view, attribute: layout11, multiplier: 1, constant: 0) let verticalConstraint = NSLayoutConstraint(item: newView, attribute: layout31, relatedBy: layout21, toItem: view, attribute: layout31, multiplier: 1, constant: 0) let widthConstraint = NSLayoutConstraint(item: newView, attribute: layout41, relatedBy: layout21, toItem: nil, attribute: layout61, multiplier: 1, constant: 100) let heightConstraint = NSLayoutConstraint(item: newView, attribute: layout51, relatedBy: layout21, toItem: nil, attribute: layout61, multiplier: 1, constant: 100) // adding all the constraint NSLayoutConstraint.activateConstraints([horizontalConstraint,verticalConstraint,widthConstraint,heightConstraint]) 

Обновлено для Swift 3

 import UIKit class ViewController: UIViewController { let redView: UIView = { let view = UIView() view.translatesAutoresizingMaskIntoConstraints = false view.backgroundColor = .red return view }() override func viewDidLoad() { super.viewDidLoad() setupViews() setupAutoLayout() } func setupViews() { view.backgroundColor = .white view.addSubview(redView) } func setupAutoLayout() { // Available from iOS 9 commonly known as Anchoring System for AutoLayout... redView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 20).isActive = true redView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -20).isActive = true redView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true redView.heightAnchor.constraint(equalToConstant: 300).isActive = true // You can also modified above last two lines as follows by commenting above & uncommenting below lines... // redView.topAnchor.constraint(equalTo: view.topAnchor, constant: 20).isActive = true // redView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true } } 

введите описание изображения здесь

Тип ограничений

  /* // regular use 1.leftAnchor 2.rightAnchor 3.topAnchor // intermediate use 4.widthAnchor 5.heightAnchor 6.bottomAnchor 7.centerXAnchor 8.centerYAnchor // rare use 9.leadingAnchor 10.trailingAnchor etc. (note: very project to project) */ 
  var xCenterConstraint : NSLayoutConstraint! var yCenterConstraint: NSLayoutConstraint! xCenterConstraint = NSLayoutConstraint(item: self.view, attribute: .CenterX, relatedBy: .Equal, toItem: (Your view NAme), attribute: .CenterX, multiplier: 1, constant: 0) self.view.addConstraint(xCenterConstraint) yCenterConstraint = NSLayoutConstraint(item: self.view, attribute: .CenterY, relatedBy: .Equal, toItem: (Your view Name), attribute: .CenterY, multiplier: 1, constant: 0) self.view.addConstraint(yCenterConstraint) 

Это один из способов программно добавлять ограничения

 override func viewDidLoad() { super.viewDidLoad() let myLabel = UILabel() myLabel.labelFrameUpdate(label: myLabel, text: "Welcome User", font: UIFont(name: "times new roman", size: 40)!, textColor: UIColor.red, textAlignment: .center, numberOfLines: 0, borderWidth: 2.0, BorderColor: UIColor.red.cgColor) self.view.addSubview(myLabel) let myLabelhorizontalConstraint = NSLayoutConstraint(item: myLabel, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0) let myLabelverticalConstraint = NSLayoutConstraint(item: myLabel, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.centerY, multiplier: 1, constant: 0) let mylabelLeading = NSLayoutConstraint(item: myLabel, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.leading, multiplier: 1, constant: 10) let mylabelTrailing = NSLayoutConstraint(item: myLabel, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.trailing, multiplier: 1, constant: -10) let myLabelheightConstraint = NSLayoutConstraint(item: myLabel, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 50) NSLayoutConstraint.activate(\[myLabelhorizontalConstraint, myLabelverticalConstraint, myLabelheightConstraint,mylabelLeading,mylabelTrailing\]) } extension UILabel { func labelFrameUpdate(label:UILabel,text:String = "This is sample Label",font:UIFont = UIFont(name: "times new roman", size: 20)!,textColor:UIColor = UIColor.red,textAlignment:NSTextAlignment = .center,numberOfLines:Int = 0,borderWidth:CGFloat = 2.0,BorderColor:CGColor = UIColor.red.cgColor){ label.translatesAutoresizingMaskIntoConstraints = false label.text = text label.font = font label.textColor = textColor label.textAlignment = textAlignment label.numberOfLines = numberOfLines label.layer.borderWidth = borderWidth label.layer.borderColor = UIColor.red.cgColor } } 

введите описание изображения здесь

Ограничения для нескольких видов на детской площадке.

быстрый 3+

  var yellowView: UIView! var redView: UIView! override func loadView() { // UI let view = UIView() view.backgroundColor = .white yellowView = UIView() yellowView.backgroundColor = .yellow view.addSubview(yellowView) redView = UIView() redView.backgroundColor = .red view.addSubview(redView) // Layout redView.translatesAutoresizingMaskIntoConstraints = false yellowView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ yellowView.topAnchor.constraint(equalTo: view.topAnchor, constant: 20), yellowView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20), yellowView.widthAnchor.constraint(equalToConstant: 80), yellowView.heightAnchor.constraint(equalToConstant: 80), redView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -20), redView.trailingAnchor.constraint(equalTo: view.trailingAnchor,constant: -20), redView.widthAnchor.constraint(equalToConstant: 80), redView.heightAnchor.constraint(equalToConstant: 80) ]) self.view = view } 

На мой взгляд, игровая площадка xcode – это лучшее место для обучения программным ограничениям.

Изображение на игровой площадке

Если вы обнаружите, что это было уродливо. Вы должны рассмотреть возможность использования DSL для ограничений. Например, SnapKit делает API ограничений более удобным для пользователя

 view.snp.makeConstraints { make in make.edges.equalToSuperview() } 

Вы добавляете все определенные ограничения в self.view что неверно, так как ограничение ширины и высоты должно быть добавлено в ваш newView .

Кроме того, насколько я понимаю, вы хотите установить постоянную ширину и высоту 100: 100. В этом случае вы должны изменить свой код на:

 var constW = NSLayoutConstraint(item: newView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 100) newView.addConstraint(constW) var constH = NSLayoutConstraint(item: newView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 100) newView.addConstraint(constH) 

Я создал эти взгляды в приведенном рис. используя Autolayout программно. Вы получите глубокое понимание ограничений и как их следует применять должным образом.

Вы можете перечислить его здесь «Введение в Autolayout»

введите описание изображения здесь

  • Разница между addSubview и insertSubview в classе UIView
  • Округленный UIView с использованием CALayers - только некоторые углы - как?
  • Переходы iPhone Curl Left и Curl Right
  • анимация addSubview
  • Рамка UIView, границы, центр, происхождение, когда использовать что?
  • Что такое блочные методы анимации в iPhone OS 4.0?
  • Метод доступа после завершения анимации UIImageView
  • Как сделать круговой UIView
  • Ориентация в UIView добавлена ​​в UIWindow
  • Взаимодействие за пределами UIView
  • Как добавить представление UIViewController в качестве подзадачи
  • Давайте будем гением компьютера.