Ширина и высота равны его супервизору с помощью Autolayout программно?
Я искал много фрагментов в сети, и я до сих пор не могу найти ответа на мою проблему. У меня вопрос у меня есть представление ScrollView(СВ) и я хочу, чтобы добавить кнопку внутри представление ScrollView(СВ) программно с такой же ширины и высоты своего суперпанель, который является функцией ScrollView(СВ), так что, когда пользователь поворачивает устройство, кнопка будет иметь тот же кадр представление ScrollView(СВ). как сделать Nslayout / NSLayoutConstraint? спасибо
10 ответов:
Я не уверен, что это самый эффективный способ сделать это, но он работает..
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];
эта ссылка может помочь вам, следуйте инструкциям:http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2
EDIT:
используйте следующий фрагмент кода, где 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)]];
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
Подход #1: Через Расширение UIView
здесь более функциональные подход к Swift 3+ С условие вместо
добавить это расширение проект:
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 framework, который также добавляет некоторые более удобные помощники пользовательского интерфейса в ваш проект.
подход #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 библиотека предоставляет метод, чтобы сделать именно это. После того, как библиотека установлена, это так же просто, как
myView.autoPinEdgesToSuperviewEdges()
есть и другие библиотеки, которые могут предоставить подобную функциональность, а также, в зависимости от вкуса, например. кладка,картография.
в качестве продолжения решения @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. Не стесняйтесь меняться в соответствии с вашими потребностями. Также обратите внимание, что это на самом деле делает subview намного больше, чем superview, который может отличаться от требований.
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), ]) } }