569 Stimmen

Wie man programmatisch Einschränkungen mit Swift hinzufügt

Ich versuche das seit letzter Woche herauszufinden, ohne einen Schritt weiter zu machen. Ok, also muss ich einige Einschränkungen programmgesteuert in Swift auf eine UIView anwenden, indem ich diesen Code verwende:

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);

Aber Xcode gibt diese seltsame Ausgabe zurück:

2014-10-03 09:48:12.657 Test[35088:2454916] Kann die Constraints nicht gleichzeitig erfüllen. Wahrscheinlich ist mindestens einer der Constraints in folgender Liste nicht gewünscht. Versuche dies: (1) betrachte jeden Constraint und versuche herauszufinden, welchen du nicht erwartest; (2) finde den Code, der den unerwünschten Constraint oder die unerwünschten Constraints hinzugefügt hat, und behebe es. (Hinweis: Wenn du NSAutoresizingMaskLayoutConstraints siehst, die du nicht verstehst, siehe die Dokumentation der UIView-Eigenschaft translatesAutoresizingMaskIntoConstraints) 
(
"",
"",
"",
""
)

Es wird versucht, den Constraint  aufzulösen.

Setze einen symbolischen Haltepunkt bei UIViewAlertForUnsatisfiableConstraints, um dies im Debugger zu erkennen. Die Methoden in der Kategorie UIConstraintBasedLayoutDebugging auf UIView in  könnten ebenfalls hilfreich sein.

2014-10-03 09:48:12.658 Test[35088:2454916] Kann die Constraints nicht gleichzeitig erfüllen. Wahrscheinlich ist mindestens einer der Constraints in folgender Liste nicht gewünscht. Versuche dies: (1) betrachte jeden Constraint und versuche herauszufinden, welchen du nicht erwartest; (2) finde den Code, der den unerwünschten Constraint oder die unerwünschten Constraints hinzugefügt hat, und behebe es. (Hinweis: Wenn du NSAutoresizingMaskLayoutConstraints siehst, die du nicht verstehst, siehe die Dokumentation der UIView-Eigenschaft translatesAutoresizingMaskIntoConstraints)
(
"",
"",
"",
""
)

Es wird versucht, den Constraint  aufzulösen.

Setze einen symbolischen Haltepunkt bei UIViewAlertForUnsatisfiableConstraints, um dies im Debugger zu erkennen. Die Methoden in der UIConstraintBasedLayoutDebugging-Kategorie auf UIView in  können ebenfalls hilfreich sein.

Kannst du mir helfen? Vielen Dank

7voto

Wali Haider Punkte 1192

Möchten Sie einige theoretische Konzepte zu Imanou Petits Antwort hinzufügen, damit man verstehen kann, wie das Auto-Layout funktioniert.

Um das Auto-Layout zu verstehen, betrachten Sie Ihre Ansicht als Gummigegenstand, der zunächst eingezogen ist.

Um ein Objekt auf dem Bildschirm zu platzieren, benötigen wir 4 obligatorische Dinge :

  • X-Koordinate des Objekts (horizontale Position).

  • Y-Koordinate des Objekts (vertikale Position)

  • Objektbreite

  • Objekthöhe.

1 X-Koordinate: Es gibt mehrere Möglichkeiten, einer Ansicht X-Koordinaten zu geben.

Zum Beispiel führende Einschränkung, nachfolgende Einschränkung, horizontal zentriert usw.

2 Y-Koordinate: Es gibt mehrere Möglichkeiten, einer Ansicht Y-Koordinaten zu geben:

Zum Beispiel obere Einschränkung, untere Einschränkung, vertikale Mitte usw.

3 Objektbreite: Es gibt zwei Möglichkeiten, einer Ansicht Breitenbeschränkungen zu geben:

a. Fügen Sie eine feste Breitenbeschränkung hinzu (betrachten Sie diese Beschränkung als Eisenstange fester Breite und haben Sie Ihren Gummigegenstand horizontal damit verbunden, damit der Gummigegenstand nicht schrumpft oder erweitert wird)

b. Fügen Sie keine Breitenbeschränkung hinzu, sondern fügen Sie X-Koordinatenbeschränkungen an beiden Enden der Ansicht hinzu, nachfolgend und führend, diese beiden Beschränkungen werden Ihren Gummigegenstand durch Ziehen/Drücken von beiden Enden, nachfolgend und führend, erweitern/schrumpfen.

4 Objekthöhe: Ähnlich wie bei der Breite gibt es auch zwei Möglichkeiten, einer Ansicht Höhenbeschränkungen zu geben:

a. Fügen Sie eine feste Höhenbeschränkung hinzu (betrachten Sie diese Beschränkungen als Eisenstange fester Höhe und haben Sie Ihren Gummigegenstand vertikal damit verbunden, damit der Gummigegenstand nicht schrumpft oder erweitert wird)

b. Fügen Sie keine Höhenbeschränkung hinzu, sondern fügen Sie X-Koordinatenbeschränkungen an beiden Enden der Ansicht oben und unten hinzu, diese beiden Beschränkungen werden Ihren Gummigegenstand durch Ziehen/Drücken von beiden Enden, oben und unten, erweitern/schrumpfen.

6voto

Ramprasath Selvam Punkte 3279

Dies ist eine Möglichkeit, Beschränkungen programmatisch hinzuzufügen

override func viewDidLoad() {
            super.viewDidLoad()

let myLabel = UILabel()
        myLabel.labelFrameUpdate(label: myLabel, text: "Willkommen Benutzer", 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 = "Dies ist ein Beispiellabel",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
    }
}

Bildbeschreibung hier eingeben

5voto

Alan Punkte 329

Es ist ein wenig anders in xcode 7.3.1. das ist was ich herausgefunden habe

   // Erstellen der Ansicht
        let newView = UIView()
        newView.backgroundColor = UIColor.redColor()
        newView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(newView)

        // Erstellen der Einschränkung

        // Attribut und Relation können nicht direkt festgelegt werden, Sie müssen eine Variable dafür erstellen
        let layout11 = NSLayoutAttribute.CenterX
        let layout21 = NSLayoutRelation.Equal
        let layout31 = NSLayoutAttribute.CenterY
        let layout41 = NSLayoutAttribute.Width
        let layout51 = NSLayoutAttribute.Height
        let layout61 = NSLayoutAttribute.NotAnAttribute

        // Definieren aller Einschränkungen
        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)

        // Hinzufügen aller Einschränkungen
        NSLayoutConstraint.activateConstraints([horizontalConstraint,verticalConstraint,widthConstraint,heightConstraint])

4voto

Yogesh shelke Punkte 438
    var xCenterConstraint : NSLayoutConstraint!
    var yCenterConstraint: NSLayoutConstraint!

 xCenterConstraint = NSLayoutConstraint(item: self.view, attribute: .CenterX, relatedBy: .Equal, toItem: (Dein Ansichtsname), attribute: .CenterX, multiplier: 1, constant: 0)
            self.view.addConstraint(xCenterConstraint)

 yCenterConstraint = NSLayoutConstraint(item: self.view, attribute: .CenterY, relatedBy: .Equal, toItem: (Dein Ansichtsname), attribute: .CenterY, multiplier: 1, constant: 0)
            self.view.addConstraint(yCenterConstraint)

4voto

Denis Kakačka Punkte 727

Versuchen Sie diese elegante UIView-Erweiterung für Einschränkungen. Sie können Einschränkungen einfach wie folgt erstellen:

 - firstView.coverWholeSuperview()
 - firstView.constraints(size: CGSize(width: 44, height: 44), centerX: view.centerXAnchor, centerY: view.centerXAnchor)
 - firstView.constraints(top: view.topAnchor, 
                         leading: secondView.leadingAnchor, 
                         bottom: view.bottomAnchor, 
                         trailing: secondView.trailingAnchor, 
                         padding: UIEdgeInsets(top: 12, left: 12, bottom: 12, right: 12))

Hier ist die Erweiterung, kopiere sie einfach in dein Projekt.

extension UIView {
    /// Befestigt alle Seiten des Empfängers an seinem übergeordneten Ansicht
    func coverWholeSuperview(margin: CGFloat = 0.0) {
        let view = superview
        layoutAttachTop(to: view, margin: margin)
        layoutAttachBottom(to: view, margin: margin)
        layoutAttachLeading(to: view, margin: margin)
        layoutAttachTrailing(to: view, margin: margin)

    }

    /// Befestigt den oberen Rand der aktuellen Ansicht an den oberen Rand der angegebenen Ansicht, falls es sich um eine übergeordnete Ansicht der aktuellen Ansicht handelt
    /// oder an ihren unteren Rand, falls nicht (angenommen, dies ist dann eine Geschwisteransicht).
    @discardableResult
    func layoutAttachTop(to: UIView? = nil, margin: CGFloat = 0.0) -> NSLayoutConstraint {

        let view: UIView? = to ?? superview
        let isSuperview = view == superview
        let constraint = NSLayoutConstraint(item: self, attribute: .top, relatedBy: .equal,
                                            toItem: view, attribute: isSuperview ? .top : .bottom, multiplier: 1.0,
                                            constant: margin)
        superview?.addConstraint(constraint)

        return constraint
    }

    // Weitere Übersetzungen hier

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X