86 votes

Width and Height Equal to its superView using autolayout programmatically ?

J'ai cherché beaucoup de snippets sur le net et je n'ai toujours pas trouvé la réponse à mon problème. Ma question est que j'ai un scrollView(SV) et je veux ajouter un bouton à l'intérieur du scrollView(SV) programmatiquement avec la même largeur et hauteur de son superview qui est scrollView(SV) de sorte que lorsque l'utilisateur tourne le périphérique le bouton aura le même cadre du scrollView(SV). comment faire le NSLayout/NSLayoutConstraint ? merci

6voto

PLJNS Points 451

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]))
    }

}

2voto

Masih Points 671

Swift 4 en utilisant 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])

2voto

Zyphrax Points 6603

J'ai repris les meilleurs éléments des autres réponses :

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)
    ])
  }
}

Vous pouvez l'utiliser comme suit, par exemple dans votre UIView personnalisée :

let myView = UIView()
myView.backgroundColor = UIColor.red

self.addSubview(myView)
myView.bindFrameToSuperviewBounds()

1voto

Matt Pinkston Points 1335

En guise de réponse complémentaire, et pour ceux qui ne sont pas opposés à l'inclusion de bibliothèques tierces, l'initiative PureLayout fournit une méthode permettant de réaliser cette opération. Une fois la bibliothèque installée, c'est aussi simple que

myView.autoPinEdgesToSuperviewEdges()

Il existe d'autres bibliothèques qui peuvent fournir des fonctionnalités similaires, selon les goûts de chacun, par exemple. Maçonnerie , Cartographie .

0voto

James Larcombe Points 9

Pour faire suite à la solution de @Dschee, voici la syntaxe de swift 3.0 : (Attention : il s'agit de ce n'est pas ma solution Je viens de le corriger pour 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]))
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X