2017-08-18 13 views
0

上部にUILabel、その下にUICollectionViewを含むスタックビューを追加しようとしています。私はそれがすべての側面に固定することによって、完全なビューを占めるようにスタックビューを制約しようとしています。私は、アプリケーションを実行するとUILabelが表示され、コレクションビューのスライスが表示されます。コレクションビューは、幅と高さがともにゼロであることを示します。助けていただければ幸いです。ありがとうございます。レイアウトアンカーを使用した自動レイアウトがプログラムで動作しない

var collectionView: UICollectionView! 
var titleLabel: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    self.view.translatesAutoresizingMaskIntoConstraints = false 
    let margins = self.view.layoutMarginsGuide 

    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() 
    layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10) 

    collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout) 
    layout.itemSize = CGSize(width: self.collectionView.frame.width/4, height: self.collectionView.frame.width/4) 
    layout.minimumInteritemSpacing = self.collectionView.frame.width/15 
    layout.minimumLineSpacing = self.collectionView.frame.width/5 

    collectionView.backgroundColor = UIColor.black 
    collectionView.dataSource = self 
    collectionView.delegate = self 
    collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell") 

    titleLabel = UILabel() 
    titleLabel.translatesAutoresizingMaskIntoConstraints = false 

    titleLabel.textAlignment = .center 
    titleLabel.numberOfLines = 1 
    titleLabel.font = UIFont.systemFont(ofSize: 22) 
    titleLabel.backgroundColor = UIColor.lightGray 
    titleLabel.text = "Challenges" 
    titleLabel.textColor = UIColor.red 

    let stackView = UIStackView(arrangedSubviews: [titleLabel, collectionView]) 
    stackView.backgroundColor = UIColor.white 
    stackView.axis = .vertical 
    stackView.distribution = .fillEqually 
    stackView.alignment = .fill 
    stackView.spacing = 5 
    self.view.addSubview(stackView) 
    stackView.translatesAutoresizingMaskIntoConstraints = false 

    //stackView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true 
    //stackView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true 
    stackView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true 
    stackView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true 
    stackView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true 
    stackView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true 
    stackView.heightAnchor.constraint(equalTo: self.view.heightAnchor, multiplier: 1.0).isActive = true 

} 

UPDATE:

私は私のコードを取り、新しいシングルビューアプリケーションでそれを実行し、期待どおりに働きました。このため、私は私がスプライトキットのゲームにこれを組み込むしようとしていることを言及する価値があると思うし、私はこれを行うことによって、ビューコントローラを発表:

let root = self.view?.window?.rootViewController 
var viewC = SelectionCollectionViewController() 
root?.present(viewC, animated: false, completion: nil) 

は、このために私が取る必要があり、特別な手順ですスプライトキットで行われますか?

+0

いくつか、私は問題と考えていたのいずれの項目のサイズを印刷することができます。 (1)できるだけフレームを使用しないでください。つまり、コレクションビューのフレームを 'CGRect.zero'に設定します。再び、私はこれが何らかの違いをもたらすとは思わない。 (2)あなたの制約を 'viewDidLoad'に設定しますが、特に自動レイアウトを使っている場合は、そこにあるサブビューフレームを参照しないでください。あなたは 'CGRect.zero'をとにかく持っています。代わりに、 'viewWillLayoutSubviews'でフレームを使うのが正しいかもしれないと思う"レイアウト "を設定してください。 (3)他の4つの制約を設定している場合、 'heightAnchor'を設定する必要はありません。それを取り除く。 – dfd

+0

最後のメモ(私は部屋がなくなった)。これらの3つのうち、私は差をつける最高のチャンスを持っていることを賭けています。 – dfd

+0

私はコードを実行し、それはUILabel - 5 ptsの間隔 - CollectionViewを示します。予想される出力は何ですか? – andyPaul

答えて

1

でこれらを行う必要があります。

enter image description here

あなたはUIStackViewを必要としないかもしれません、あなたは直接self.viewに追加することができます。

一度self.viewに追加すると、制約を設定できます。あなたはviewDidLayoutSubviews

class ViewController: UIViewController { 

    var collectionView: UICollectionView! 
    var titleLabel: UILabel! 
    let collectionCellIdentifier:String = "collectionCellId" 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() 
     layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10) 

     collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout) 
     collectionView.delegate = self 
     collectionView.dataSource = self 
     collectionView.register(UICollectionViewCell.classForCoder(), forCellWithReuseIdentifier: collectionCellIdentifier) 

     collectionView.backgroundColor = UIColor.black 
     collectionView.dataSource = self 
     collectionView.delegate = self 
     collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell") 

     titleLabel = UILabel() 


     titleLabel.textAlignment = .center 
     titleLabel.numberOfLines = 1 
     titleLabel.font = UIFont.systemFont(ofSize: 22) 
     titleLabel.backgroundColor = UIColor.lightGray 
     titleLabel.text = "Challenges" 
     titleLabel.textColor = UIColor.red 
     titleLabel.translatesAutoresizingMaskIntoConstraints = false 
     collectionView.translatesAutoresizingMaskIntoConstraints = false 
     self.view.addSubview(titleLabel) 
     self.view.addSubview(collectionView) 

     setUpConstraints() 
    } 


    func setUpConstraints(){ 
     self.view.addConstraint(NSLayoutConstraint(item: self.titleLabel, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier:0, constant:50.0)) 
     titleLabel.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true 
     titleLabel.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true 
     titleLabel.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true 


     collectionView.topAnchor.constraint(equalTo: titleLabel.bottomAnchor).isActive = true 
     collectionView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true 
     collectionView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true 
     collectionView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true 
    } 

    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 
     let flowLayout = (collectionView.collectionViewLayout as! UICollectionViewFlowLayout) 
     flowLayout.itemSize = CGSize(width: collectionView.frame.width/4.0 , height: collectionView.frame.width/4.0) 
     flowLayout.minimumInteritemSpacing = self.collectionView.frame.width/15.0 
     flowLayout.minimumLineSpacing = self.collectionView.frame.width/5.0 
    } 


} 

extension ViewController:UICollectionViewDataSource,UICollectionViewDelegate { 


    func numberOfSections(in collectionView: UICollectionView) -> Int { 
     return 1 
    } 


    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return 10 
    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: collectionCellIdentifier, for: indexPath) 
     cell.backgroundColor = UIColor.gray 
     return cell 
    } 

} 
+0

これで解決しました。ありがとうございます! –

0

私はあなたがこれらの関数で起こるかを知る必要があると思う:

  • のviewDidLoad
  • viewWillAppear
  • viewWillLayoutSubviews
  • viewDidLayoutSubviews
  • viewDidAppear

あなたはのautoLayoutを使用している場合、いつでの場合、viewWillLayoutSubviews()viewDidLayoutSubviews()のときにビューが自動調整されるため、フレームが確認されないので、これらのコードをviewDidAppear()に作成してから、表示することをお勧めします。あなたはストーリーボードやペン先を使用する場合

はさらに、あなたはスクリーンショットが予想される出力である下に、私は信じていawakeFromNib()

+0

ご協力ありがとうございます!私はすべてのコードをviewDidAppear()に入れましたが、それでもまだ動作しませんでした。 –

関連する問題