Если кто-то ищет решение Swift - я бы создал расширениеUIView
Swift, которое будет помогать вам каждый раз, когда вы хотите привязать фрейм subviews к его границам superviews:
Swift 2:
extension UIView {
func bindFrameToSuperviewBounds() {
guard let superview = self.superview else {
print("Error! `superview` was nil – call `addSubview(view: UIView)` before calling `bindFrameToSuperviewBounds()` to fix this.")
return
}
self.translatesAutoresizingMaskIntoConstraints = false
superview.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[subview]-0-|", options: .DirectionLeadingToTrailing, metrics: nil, views: ["subview": self]))
superview.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[subview]-0-|", options: .DirectionLeadingToTrailing, metrics: nil, views: ["subview": self]))
}
}
Swift 3:
extension UIView {
func bindFrameToSuperviewBounds() {
guard let superview = self.superview else {
print("Error! `superview` was nil – call `addSubview(view: UIView)` before calling `bindFrameToSuperviewBounds()` to fix this.")
return
}
self.translatesAutoresizingMaskIntoConstraints = false
superview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[subview]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["subview": self]))
superview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[subview]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["subview": self]))
}
}
Swift 4.2:
extension UIView {
func bindFrameToSuperviewBounds() {
guard let superview = self.superview else {
print("Error! `superview` was nil – call `addSubview(view: UIView)` before calling `bindFrameToSuperviewBounds()` to fix this.")
return
}
self.translatesAutoresizingMaskIntoConstraints = false
self.topAnchor.constraint(equalTo: superview.topAnchor, constant: 0).isActive = true
self.bottomAnchor.constraint(equalTo: superview.bottomAnchor, constant: 0).isActive = true
self.leadingAnchor.constraint(equalTo: superview.leadingAnchor, constant: 0).isActive = true
self.trailingAnchor.constraint(equalTo: superview.trailingAnchor, constant: 0).isActive = true
}
}
Тогда просто назовите это так :
subview.bindFrameToSuperviewBounds()
constant: 0
деталь.Я не уверен, что это самый эффективный способ сделать это, но он работает ..
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.translatesAutoresizingMaskIntoConstraints = NO; // initialize [coverForScrolView addSubview:button]; NSLayoutConstraint *width =[NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeWidth relatedBy:0 toItem:coverForScrolView attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0]; NSLayoutConstraint *height =[NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeHeight relatedBy:0 toItem:coverForScrolView attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0]; NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:coverForScrolView attribute:NSLayoutAttributeTop multiplier:1.0f constant:0.f]; NSLayoutConstraint *leading = [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:coverForScrolView attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.f]; [coverForScrolView addConstraint:width]; [coverForScrolView addConstraint:height]; [coverForScrolView addConstraint:top]; [coverForScrolView addConstraint:leading];
источник
NSLayoutConstraint.activateConstraints([width, height, top, leading])
[coverForScrolView addConstraints:@[width, height, top, leading]];
Эта ссылка может вам помочь, следуйте инструкциям: http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2
РЕДАКТИРОВАТЬ :
используйте следующий фрагмент кода, где subview - это ваш subivew.
[subview setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[subview]-0-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(subview)]]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[subview]-0-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(subview)]];
источник
V:|[subview]|
иH:|[subview]|
addConstraint
иremoveConstraint
методы для UIView будут устаревшими, поэтому стоит использовать «удобства создания ограничений»:view.topAnchor.constraint(equalTo: superView.topAnchor, constant: 0).isActive = true view.bottomAnchor.constraint(equalTo: superView.bottomAnchor, constant: 0).isActive = true view.leadingAnchor.constraint(equalTo: superView.leadingAnchor, constant: 0).isActive = true view.trailingAnchor.constraint(equalTo: superView.trailingAnchor, constant: 0).isActive = true
источник
constant: 0
деталь.Подход №1: через расширение UIView
Вот более функциональный подход в Swift 3+ с предварительным условием вместо
print
(который может легко исчезнуть в консоли). Этот сообщит об ошибках программиста как о неудачных сборках.Добавьте это расширение в свой проект:
extension UIView { /// Adds constraints to the superview so that this view has same size and position. /// Note: This fails the build if the `superview` is `nil` – add it as a subview before calling this. func bindEdgesToSuperview() { guard let superview = superview else { preconditionFailure("`superview` was nil – call `addSubview(view: UIView)` before calling `bindEdgesToSuperview()` to fix this.") } translatesAutoresizingMaskIntoConstraints = false ["H:|-0-[subview]-0-|", "V:|-0-[subview]-0-|"].forEach { visualFormat in superview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: visualFormat, options: .directionLeadingToTrailing, metrics: nil, views: ["subview": self])) } } }
Теперь просто назовите это так:
// after adding as a subview, e.g. `view.addSubview(subview)` subview.bindEdgesToSuperview()
Обратите внимание, что указанный выше метод уже интегрирован в мою структуру HandyUIKit, которая также добавляет в ваш проект еще несколько удобных помощников пользовательского интерфейса.
Подход # 2: использование фреймворка
Если вы много работаете с программными ограничениями в своем проекте, я рекомендую вам проверить SnapKit . Это делает работу с ограничениями намного проще и менее подверженной ошибкам .
Следуйте инструкциям по установке в документации, чтобы включить SnapKit в свой проект. Затем импортируйте его в верхнюю часть файла Swift:
import SnapKit
Теперь вы можете добиться того же с помощью всего этого:
subview.snp.makeConstraints { make in make.edges.equalToSuperview() }
источник
Swift 3:
import UIKit extension UIView { func bindFrameToSuperviewBounds() { guard let superview = self.superview else { print("Error! `superview` was nil – call `addSubview(view: UIView)` before calling `bindFrameToSuperviewBounds()` to fix this.") return } self.translatesAutoresizingMaskIntoConstraints = false superview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[subview]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["subview": self])) superview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[subview]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["subview": self])) } }
источник
Swift 4, используя
NSLayoutConstraint
:footerBoardImageView.translatesAutoresizingMaskIntoConstraints = false let widthConstraint = NSLayoutConstraint(item: yourview, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: superview, attribute: NSLayoutAttribute.width, multiplier: 1, constant: 0) let heightConstraint = NSLayoutConstraint(item: yourview, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: superview, attribute: NSLayoutAttribute.height, multiplier: 1, constant: 0) superview.addConstraints([widthConstraint, heightConstraint])
источник
В качестве дополнительного ответа и для тех, кто не возражает против включения сторонних библиотек, библиотека PureLayout предоставляет способ сделать именно это. После установки библиотеки это так же просто, как
Существуют и другие библиотеки, которые могут предоставлять аналогичные функции, в зависимости от вкуса, например. Кладка , Картография .
источник
Я выбрал лучшие элементы из других ответов:
extension UIView { /// Adds constraints to this `UIView` instances `superview` object to make sure this always has the same size as the superview. /// Please note that this has no effect if its `superview` is `nil` – add this `UIView` instance as a subview before calling this. func bindFrameToSuperviewBounds() { guard let superview = self.superview else { print("Error! `superview` was nil – call `addSubview(view: UIView)` before calling `bindFrameToSuperviewBounds()` to fix this.") return } self.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ self.topAnchor.constraint(equalTo: superview.topAnchor), self.bottomAnchor.constraint(equalTo: superview.bottomAnchor), self.leadingAnchor.constraint(equalTo: superview.leadingAnchor), self.trailingAnchor.constraint(equalTo: superview.trailingAnchor) ]) } }
Вы можете использовать его так, например, в своем пользовательском UIView:
let myView = UIView() myView.backgroundColor = UIColor.red self.addSubview(myView) myView.bindFrameToSuperviewBounds()
источник
Как продолжение решения @Dschee, вот синтаксис swift 3.0: (Обратите внимание: это не мое решение , я только что исправил его для Swift 3.0)
extension UIView { /// Adds constraints to this `UIView` instances `superview` object to make sure this always has the same size as the superview. /// Please note that this has no effect if its `superview` is `nil` – add this `UIView` instance as a subview before calling this. func bindFrameToSuperviewBounds() { guard let superview = self.superview else { print("Error! `superview` was nil – call `addSubview(view: UIView)` before calling `bindFrameToSuperviewBounds()` to fix this.") return } self.translatesAutoresizingMaskIntoConstraints = false superview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[subview]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["subview": self])) superview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[subview]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["subview": self])) }
источник
Мне нужно было полностью покрыть супервизор. Другие не стали бы этого делать при смене ориентации. Итак, я написал новый, который работает - с произвольным множителем размера 20. Не стесняйтесь изменять в соответствии с вашими потребностями. Также обратите внимание, что это фактически делает подпредставление намного больше супервизора, которое может отличаться от требований.
extension UIView { func coverSuperview() { guard let superview = self.superview else { assert(false, "Error! `superview` was nil – call `addSubview(_ view: UIView)` before calling `\(#function)` to fix this.") return } self.translatesAutoresizingMaskIntoConstraints = false let multiplier = CGFloat(20.0) NSLayoutConstraint.activate([ self.heightAnchor.constraint(equalTo: superview.heightAnchor, multiplier: multiplier), self.widthAnchor.constraint(equalTo: superview.widthAnchor, multiplier: multiplier), self.centerXAnchor.constraint(equalTo: superview.centerXAnchor), self.centerYAnchor.constraint(equalTo: superview.centerYAnchor), ]) } }
источник