2016-07-03 4 views
0

Я разработал свое представление в раскадровке с использованием автоматической компоновки, но у меня есть некоторые проблемы с реализацией этого программно с помощью VFL. Эта точка зрения выглядит в портрете enter image description hereiOS autolayout реализует программно с VFL

Есть три подвиды расположение по вертикали в определенном порядке, и в какой-то метод, мы можем изменить их порядок (т.е. [1,2,3], чтобы [2,3,1 ]). view1, view2, view3 все имеют фиксированную ширину = 100 и height = 100, центр view2 равен центру своего супервизора. Когда изменения в ландшафтном режиме, три подвиды макет по горизонтали в том же порядке, как они были в портретном, так: enter image description here

Надежда кто-то может помочь мне осуществить это, спасибо за любую помощь! И здесь вы можете загрузить мой образец проекта в случае, если я не описал свою проблему четко! https://github.com/SomnusLee1988/SamplePorject

+0

Вы пробовали UIStackView HTTPS: //developer.apple.com/library/ios/documentation/UIKit/Reference/UIStackView_Class_Reference/ –

+0

afaik вы не можете установить равное ограничение центра (которое является одним из необходимых вам ограничений) с помощью vfl. –

ответ

1

, так как вы не можете настроить ограничения, вам нужно всего лишь с ЛВЖ это может быть решение:

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

Великий ~ Он работает – SomnusLee

+0

Рад, что я мог бы помочь :) –

+0

@Slotla, у меня есть еще один вопрос. Почему я не могу настроить центр выравнивания для ограничений центра наблюдения с помощью VFL? – SomnusLee

Смежные вопросы