2016-07-03 11 views
0

Ich habe meine Ansicht in Storyboard mit Auto-Layout entworfen, aber ich habe einige Probleme bei der Umsetzung dieses programmgesteuert mit VFL. Diese Ansicht sieht im Porträt enter image description hereiOS-Auto-Layout programmgesteuert mit VFL implementieren

Es gibt drei Subviews Layout vertikal in einer bestimmten Reihenfolge und in einigen Verfahren können wir die Reihenfolge ändern (dh [1,2,3] bis [2,3,1 ]). view1, view2, view3 alle haben eine feste Breite = 100 und eine Höhe = 100, das Zentrum von view2 entspricht dem Zentrum der Superview. Wenn eine Änderung in das Querformat, die drei Subviews horizontal Layout in der gleichen Reihenfolge, wie sie im Portrait waren, wie folgt aus: enter image description here

Hoffnung jemand mir dies zu implementieren helfen könnte, vielen Dank für jede Hilfe! Und hier können Sie mein Beispielprojekt herunterladen, falls ich mein Problem nicht klar beschrieben habe! https://github.com/SomnusLee1988/SamplePorject

+0

Haben Sie versucht UIStackView https: //developer.apple.com/library/ios/documentation/UIKit/Reference/UIStackView_Class_Reference/ –

+0

afaik Sie können mit vfl keine Gleichheits-Integritätsbedingung (eine der Einschränkungen, die Sie benötigen) einrichten. –

Antwort

1

, da Sie nicht Setup können die Einschränkungen, die Sie alles nur mit VFL benötigen diese eine Lösung sein könnte:

var view1: UIView! 
var view2: UIView! 
var view3: UIView! 

var variableConstraints = [NSLayoutConstraint]() 

let metrics = ["width": 100, "height": 100] 
var views: [String: AnyObject]! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    view1 = UIView() 
    view1.backgroundColor = UIColor.redColor() 
    view1.translatesAutoresizingMaskIntoConstraints = false 
    view.addSubview(view1) 

    view2 = UIView() 
    view2.backgroundColor = UIColor.blueColor() 
    view2.translatesAutoresizingMaskIntoConstraints = false 
    view.addSubview(view2) 

    view3 = UIView() 
    view3.backgroundColor = UIColor.greenColor() 
    view3.translatesAutoresizingMaskIntoConstraints = false 
    view.addSubview(view3) 

    views = ["v1": view1, "v2": view2, "v3": view3] 

    setupFixedConstraints() 
    setupVariableConstraintsForSize(nil) 
} 

private func setupFixedConstraints() { 
    // width and height 
    NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("[v2(width)]", options: [], metrics: metrics, views: views)) 
    NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[v2(height)]", options: [], metrics: metrics, views: views)) 

    // center x and center y 
    NSLayoutConstraint(item: view2, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: 0).active = true 
    NSLayoutConstraint(item: view2, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1, constant: 0).active = true 
} 

private func setupVariableConstraintsForSize(size: CGSize?) { 
    // remove existing constraints 
    NSLayoutConstraint.deactivateConstraints(variableConstraints) 
    variableConstraints.removeAll() 

    let size = size ?? view.frame.size 

    if size.width > size.height { 
     // landscape 
     variableConstraints += NSLayoutConstraint.constraintsWithVisualFormat("[v1(==v2)][v2][v3(==v2)]", options: [.AlignAllTop, .AlignAllBottom], metrics: metrics, views: views) 
    } else { 
     // portrait 
     variableConstraints += NSLayoutConstraint.constraintsWithVisualFormat("V:[v1(==v2)][v2][v3(==v2)]", options: [.AlignAllLeading, .AlignAllTrailing], metrics: metrics, views: views) 
    } 

    // activate constraints 
    NSLayoutConstraint.activateConstraints(variableConstraints) 
} 

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
    setupVariableConstraintsForSize(size) 
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) 
} 
+0

Great ~ Es funktioniert – SomnusLee

+0

Froh kann ich helfen :) –

+0

@Slotla, ich habe noch eine Frage. Warum kann ich nicht mit den VFL Center-Constraints zentrieren? – SomnusLee

Verwandte Themen