如何通过代码在方向更改时向UIStackView.Axis添加更改?

Bja*_*rte 5 swift ios9 uistackview

我通过UIStackView编程方式添加了一些Axis应用程序,当应用程序处于运行状态时,我希望它们具有其他功能Regular Width and Any Height

就像在界面生成器中一样,这是否有可能?

我在Google遇到的只是willTransitionToTraitCollection,但不是我所需要的。

为了更容易理解我的需求:

for i in numberOfItems {
    let stackView = UIStackView()
    stackView.append... // add views in this new stack view

    // here is where I need help:
    stackView.axis = horizontal
    stackView.addSomething... stackView.axis = vertical if regular width and any height.

    existingStackView.append.... stackView
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我找到了另一种方法,但是在iPhone 6+上旋转时,出现了一些奇怪的现象。Git回购:https : //github.com/bjaskj/iOSStackViewConstraints

class MyStackView: UIStackView {
    override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)

        if traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Regular {
            axis = UILayoutConstraintAxis.Horizontal
        } else {
            axis = UILayoutConstraintAxis.Vertical
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ViewController:

@IBOutlet weak var mainStackView: UIStackView!

override func viewDidLoad() {
    super.viewDidLoad()
    addElement("Name", description: "Saint Petersburg")
    addElement("Native name", description: "?????-?????????")
    addElement("Country", description: "Russia")
    addElement("Federal district", description: "Northwestern")
    addElement("Economic region", description: "Northwestern")
    addElement("Established", description: "May 27, 1703")
}

func addElement(title:String, description:String) {

    let labelTitle = UILabel()
    labelTitle.backgroundColor = UIColor.redColor()
    labelTitle.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
    labelTitle.text = title
    labelTitle.textColor = UIColor.whiteColor()

    let labelDescription = UILabel()
    labelDescription.backgroundColor = UIColor.blueColor()
    labelDescription.font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody)
    labelDescription.text = description
    labelDescription.textColor = UIColor.whiteColor()

    let stackHolder = MyStackView()
    stackHolder.axis = .Vertical
    stackHolder.distribution = .FillEqually

    stackHolder.addArrangedSubview(labelTitle)
    stackHolder.addArrangedSubview(labelDescription)
    stackHolder.spacing = 8

    mainStackView.addArrangedSubview(stackHolder)
}
Run Code Online (Sandbox Code Playgroud)

我旋转时会发生以下情况iPhone 6+在此处输入图片说明

但是如果我以旋转位置启动应用程序,我会得到什么: 在此处输入图片说明

Rob*_*ack 6

更新:

好的,看来您有两个问题:

1)当我将stackviews添加到场景中时,如何根据大小类添加适当的stackview.axis:

for i in numberOFItems {
    let stackView = UIStackView()

    if view.traitCollection.verticalSizeClass == .Unspecified && view.traitCollection.horizontalSizeClass == .Regular {
        stackView.axis = .Vertical
    } else {
        stackView.axis = .Horizonal
    }

    stackView.addArrangedSubview(arrayOfViews[i])
}
Run Code Online (Sandbox Code Playgroud)

2)如何在更改手机方向时使stackview从水平轴更改为垂直轴:

您将需要拥有一个已初始化的堆栈视图数组。然后,您需要在委托方法中单步执行stackview并更改其方向。

override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
    var axis

    if view.traitCollection.verticalSizeClass == .Compact {
        axis = UILayoutConstraintAxis.Horizontal
    } else {
        axis = UILayoutConstraintAxis.Vertical
    }

    for stackView in stackViewArray {
        stackView.axis = axis
    }
}
Run Code Online (Sandbox Code Playgroud)

该视图具有一个traitCollection,其中包括verticalSizeClass和horizo​​ntalSizeClass。这些可以具有.Compact,.Regular和.Unspecified的值。

每当修改尺寸类别时(即,当手机被打开时),traittraitDidChange方法应告诉您。

如果仍然无法回答您的问题,请尝试重写您的问题,以便于理解

另外,我无法知道一次设置这些属性并完成操作,您必须同时处理这两种情况。