2016-08-28 8 views
1

私は自分のスタックビューを自動レイアウトしようとしていて、その配列のarrangedSubView(2つのラベルと1つのイメージ)をコードに作成しようとしていますが、シミュレータにはスタックビューのセットが1つしか表示されません。コンソールで結果を印刷するときは、すべてのラベルとイメージに値がありますが、スタックビューのフレームはすべて0.0;0.0です。なぜこのようなことが起こるのですか?スタックビューが表示されないのはなぜですか?あなたが見ることができるようになぜスタックビューのフレームが(0.0、0.0)ですか?

コード

let contentView: UIView = UIView() 
let stackView: UIStackView = UIStackView() 

var singleStack = Array(count: 6, repeatedValue: UIStackView()) 
var timeLabel = Array(count: 6, repeatedValue: UILabel()) 
var iconImage = Array(count: 6, repeatedValue: UIImageView()) 
var tempLabel = Array(count: 6, repeatedValue: UILabel()) 

override func viewDidLoad() { 
    super.viewDidLoad() 

    for index in 0...5 {    
     timeLabel[index].text = "0\(index):00" 
     iconImage[index].image = UIImage(named: "sunny")! 
     tempLabel[index].text = "0\(index)°" 

     singleStack[index].addArrangedSubview(timeLabel[index]) 
     singleStack[index].addArrangedSubview(iconImage[index]) 
     singleStack[index].addArrangedSubview(tempLabel[index]) 

     singleStack[index].translatesAutoresizingMaskIntoConstraints = false 
     singleStack[index].axis = .Vertical 
     singleStack[index].alignment = .Center 
     singleStack[index].distribution = .FillEqually 

     stackView.addArrangedSubview(singleStack[index]) 

     print("\(timeLabel[index].text!)") 
     print("\(iconImage[index].image!)") 
     print("\(tempLabel[index].text!)") 
     print("\(singleStack[index])") 
     print("\(stackView)") 
     } 

    stackView.translatesAutoresizingMaskIntoConstraints = false 
    stackView.axis = .Horizontal 
    stackView.alignment = .Fill 
    stackView.distribution = .FillEqually 

    contentView.backgroundColor = UIColor.lightGrayColor() 

    view.addSubview(contentView) 
    contentView.addSubview(stackView) 

    contentView.translatesAutoresizingMaskIntoConstraints = false 

    NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
     "H:|[stackView]|", 
     options: [], 
     metrics: nil, 
     views: ["stackView": stackView])) 

    NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
     "V:|[stackView]|", 
     options: [], 
     metrics: nil, 
     views: ["stackView": stackView])) 
    NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
     "H:|-[contentView]-|", 
     options: [], 
     metrics: nil, 
     views: ["contentView": contentView])) 

    NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
     "V:[contentView(120)]-16-|", 
     options: [], 
     metrics: nil, 
     views: ["contentView": contentView])) 

} 

コンソールでの印刷結果(ちょうど例えば1枚を使用)

01:00 
<UIImage: 0x7fb61944f630>, {32, 32} 
01° 
<UIStackView: 0x7fb6194462c0; frame = (0 0; 0 0); layer = <CATransformLayer: 0x7fb619445e70>> 
<UIStackView: 0x7fb619443b50; frame = (0 0; 0 0); layer = <CATransformLayer: 0x7fb6194433b0>> 

:以下の私のコードを参照してください。すべてのラベルとイメージには値がありますが、スタックビューのフレームはすべて0.0;0.0です。

誰でも私の問題を解決できることを願っております、あらかじめ大変ありがとうございます!

+0

?今のところ、あなたは '= UIStackView()'を使って両方のスタックビューを初期化しているようですが、デフォルトで0.0、0.0のフレームが返されます。 –

+0

@BenjaminLowry彼は制約を使用しています。 – matt

+0

@matt私が間違っている場合は私を修正しますが、彼は制約が作成される前にスタックビューの値を出力していませんか? –

答えて

1

Array(count: , repeatedValue:)で配列を初期化し、repeatedValueがクラスである場合、クラスカウントの同じインスタンスを指すポインターの配列を取得することになります。迅速なクラスは参照によって渡されます。だからsingleStack[0] === singleStack[2]これは=== singleStack[5]などです。これは、スタックビューが1つしか表示されない理由です。あなたは絶対にあなたがあなたのスタックビューに追加し、不格好になりarrangedSubviewsを使用しているビューの配列を必要としない限り

for index in 0...5 { 
    let singleStack = UIStackView() 
    let timeLabel = UILabel() 
    let iconImage = UIImageView() 
    let tempLabel = UILabel() 

    timeLabel.text = "0\(index):00" 

    iconImage.image = UIImage(named: "sunny")! 

    tempLabel.text = "0\(index)°" 

    singleStack.addArrangedSubview(timeLabel) 
    singleStack.addArrangedSubview(iconImage) 
    singleStack.addArrangedSubview(tempLabel) 

    singleStack.axis = .Vertical 
    singleStack.alignment = .Center 
    singleStack.distribution = .FillEqually 
    self.stackView.addArrangedSubview(singleStack) 
} 

:あなたのような何かにループのためにあなたを変更する必要があります。その場合には、使用にのような初期化ブロックを持っている方が良いでしょう:

let singleStack: [UIStackView] = 
{ 
    var singleStacks = [UIStackView]() 
    for _ in 0...5 
    { 
     singleStacks.append(UIStackView()) 
    } 
    return singleStacks 
}() 

など...あなたは「stackViews」フレームを変更します期待しているコードの何行

+0

アドバイスをいただき、ありがとうございます。 – stephen

関連する問題