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

3voto

Valerii Lider Punkte 1754

Sie fügen alle definierten Einschränkungen zu self.view hinzu, was falsch ist, da Breite- und Höhenbeschränkungen zu Ihrem newView hinzugefügt werden sollten.

Außerdem möchte ich darauf hinweisen, dass Sie eine konstante Breite und Höhe von 100:100 festlegen möchten. In diesem Fall sollten Sie Ihren Code wie folgt ändern:

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)

2voto

aturan23 Punkte 3634

Sie können Snapkit verwenden, um programmgesteuert Einschränkungen festzulegen.

class ViewController: UIViewController {

    let rectView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))

    override func viewDidLoad() {
        super.viewDidLoad()
        setupViews()
    }

    private func setupViews() {
        rectView.backgroundColor = .red
        view.addSubview(rectView)

        rectView.snp.makeConstraints {
          $0.center.equalToSuperview()
        }
    }
}

1voto

Vladimir Punkte 7426

Der Fehler wird durch Einschränkungen verursacht, die automatisch aus der automatischen Größenanpassungsmaske erstellt werden. Sie werden erstellt, weil die UIView-Eigenschaft translatesAutoresizingMaskIntoConstraints standardmäßig auf true gesetzt ist.

Erwägen Sie die Verwendung von BoxView, um all das manuelle Einschränkungserstellungs-Boilerplate loszuwerden und Ihren Code kompakt und lesbar zu machen. Das Layout in Frage mit BoxView zu erstellen ist sehr einfach:

boxView.items = [
   new_view.boxed.centerX().centerY().relativeWidth(1.0).relativeHeight(1.0)
]

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