2017-03-24 4 views
0

Hier ist eine Methode, bei der ich eine Unteransicht an eine UIView Instanz anhefte. Entschuldigen Sie den unordentlichen Code, ich habe experimentiert, um das zum Laufen zu bringen.Die unteren und rechten Sichtbedingungen sind negativ?

open static func withEmbeddedView(_ view: UIView, andFixedHeight height: CGFloat) -> PMGAlertControllerEmbedComponent { 
    let base = PMGAlertControllerEmbedComponent(frame: CGRect.zero) 
    base.addSubview(view) 
    view.translatesAutoresizingMaskIntoConstraints = false 
    base.translatesAutoresizingMaskIntoConstraints = false 

    let left = NSLayoutConstraint(item: view, attribute: .left, relatedBy: .equal, toItem: base, attribute: .left, multiplier: 1, constant: 0) 
    let right = NSLayoutConstraint(item: view, attribute: .right, relatedBy: .equal, toItem: base, attribute: .right, multiplier: 1, constant: 0) 
    let top = NSLayoutConstraint(item: view, attribute: .top, relatedBy: .equal, toItem: base, attribute: .top, multiplier: 1, constant: 0) 
    let bottom = NSLayoutConstraint(item: view, attribute: .bottom, relatedBy: .equal, toItem: base, attribute: .bottom, multiplier: 1, constant: 0) 
    base.addConstraints([left, right, top, bottom]) 
    view.addConstraint(NSLayoutConstraint(item: view, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: height)) 
    base.leftConstraint = left 
    base.rightConstraint = right 
    base.topConstraint = top 
    base.bottomConstraint = bottom 
    base.layoutIfNeeded() 
    return base 
} 

Jetzt funktioniert das an sich gut, aber sobald ich versuche, und ändern Sie diese an anderer Stelle Konstanten der Einschränkung, sagen sie 16 machen ein bisschen Polsterung hinzuzufügen, gehen die rechten und unteren Randbedingungen in die andere Richtung! Also, anstatt dass die Subview kleiner ist als die Superview um 16Punkte, ist sie um 16Punkte größer? Oben und links verhalten sich wie erwartet.

Beachten Sie, dass, wenn ich die obere und linke Seite auf 16, aber die untere und rechte auf -16 stelle, das gewünschte Ergebnis erzeugt, aber ich sollte das nicht tun müssen? Wo gehe ich falsch?

Vielen Dank.

Antwort

3

Die Reihenfolge der Elemente in Ihrer Einschränkung ist von Bedeutung.

Änderung

let bottom = NSLayoutConstraint(item: view, attribute: .bottom, relatedBy: .equal, toItem: base, attribute: .bottom, multiplier: 1, constant: 0) 
let right = NSLayoutConstraint(item: view, attribute: .right, relatedBy: .equal, toItem: base, attribute: .right, multiplier: 1, constant: 0) 

zu

let bottom = NSLayoutConstraint(item: base, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0) 
let right = NSLayoutConstraint(item: base, attribute: .right, relatedBy: .equal, toItem: view, attribute: .right, multiplier: 1, constant: 0) 

Versuch, so denken: das zweite Element als Ursprung behandeln. Wenn der Wert positiv ist, befindet sich der erste Artikel in der rechten/unteren Richtung des zweiten Artikels. Wenn der Wert negativ ist, bedeutet dies, dass die Richtung links und oben auf dem zweiten Element liegt.

Da Sie view innerhalb der base setzen wollen, und Sie wollen positiven Wert in Constraint, müssen Sie base als erstes Element verwenden, und view als zweiten Punkt (Ursprung) in der Beschränkung. Es bedeutet also base ist rechts/unten zu view, wenn die Konstante der Einschränkung positiv ist.

+0

Völlig logisch denke ich jetzt auf diese Weise, danke für eine solide Erklärung und Beispiel. :) –

+0

Gern geschehen :) – Elvin

0

Sounds bonkers. Kann jetzt nicht es betrachten, aber ich neige dazu, die Einschränkungen in Storyboard bis setzen, erstellen Stellen für sie und sie mögen ändern:

self.menuTopConstraint.constant = 64 

die obere Beschränkung eines Menüs auf dem Boden des nav nach unten bewegen würde Bar.

meine Hauptansicht nach unten durch die Höhe des Menüs schieben:

self.mainViewBottomConstraint.constant = self.indexHeight * -1 

auf sie geht nicht auf die Frage Kopf Appreciating. Kann schauen wenn ich mehr Zeit habe.

Verwandte Themen