2016-06-01 11 views
1

私はスクロールビューを設定し、スクロールビューに制約を追加しています。しかし、それは空白の画面を表示しています。下記のコードを確認してください。constraintsWithVisualFormatによる自動レイアウトがうまく機能しない

override func loadView() 
    { 
     super.loadView() 
     scrollView = UIScrollView(frame:CGRectZero) 
     scrollView.backgroundColor = UIColor.whiteColor() 

     scrollView.sizeToFit() 

     self.view.addSubview(scrollView) 
     scrollView.backgroundColor = UIColor.blueColor() 

     contentView = UIView() 
//  contentView.setTranslatesAutoresizingMaskIntoConstraints(false) 
     contentView.backgroundColor = UIColor.redColor() 
     scrollView.addSubview(contentView) 

     var viewBindingsDictBoth = [String: AnyObject]() 
     viewBindingsDictBoth["scrollView"] = scrollView 
     viewBindingsDictBoth["contentView"] = contentView 
     viewBindingsDictBoth["mainView"] = self.view 


     view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[scrollView]-0-|",options: [], metrics: nil, views:viewBindingsDictBoth)) 

     view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[scrollView]-0-|",options: [], metrics: nil, views:viewBindingsDictBoth)) 

     view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[contentView]|",options: [], metrics: nil, views:viewBindingsDictBoth)) 
     view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[contentView]|",options: [], metrics: nil, views:viewBindingsDictBoth)) 

     view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[contentView(==mainView)]",options: [], metrics: nil, views:viewBindingsDictBoth)) 

     self.view.contentMode = UIViewContentMode.Redraw 
    } 

事前に感謝を...

+0

これを実行しているときに、コンソールで警告を見ているの? – jrturton

+0

'self.view'(' mainView')と 'contentView'の間に制約を設けることはできません。 – Sulthan

答えて

2

あなたが不足している最も重要なことは、私はあなたの制約のいくつかは完璧ではないが、最大の問題は、すべてのビューが使用されていることだと思い

scrollView.translatesAutoresizingMaskIntoConstraints = false 

contentView.translatesAutoresizingMaskIntoConstraints = false 

ですデフォルトでの測位のための自動サイズ変更プロパティそれらはあなたの制約と衝突します。 UIView.translatesAutoresizingMaskIntoConstraints documentationから

:自動サイズ変更マスクの制約が完全にビューのサイズと位置を指定することを

注意。したがって、コンストレイントを導入することなく、このサイズや位置を変更するための制約を追加することはできません。自動レイアウトを使用してビューのサイズと位置を動的に計算する場合は、このプロパティをfalseに設定する必要があります。この場合、ビューにはあいまいで矛盾しない制約のセットを指定する必要があります。

(強調鉱山)

0

ルート・ビューを作成する必要がありますあなたのViewControllerのloadViewメソッド()メソッドで。今あなたのルートビューは、私は本当にのUIViewの異なるサブクラスであるように、ベースビュー(self.view)を取得しようとしている場合を除き、私は通常loadViewを上書きすることは非常に不必要見つける
view = UIView()

1

nilです。 loadViewは、忘れてしまったself.viewの値を初期化するためのものです。

わかりやすくするため、ビューの初期化をviewDidLoadにすることをお勧めします。

override func viewDidLoad() { 
    // Do your init here 
} 
+0

私は 'super.loadView()'がビューを生成すると思います。とにかく 'view'が' nil'ならばクラッシュするでしょう。 – Sulthan

+0

@Sulthanそれは間違っています。 "このメソッドのカスタム実装はスーパーを呼び出すべきではありません" –

+0

推奨は論理的です。メソッドの全体がビューを作成し、別のビューを作成するために 'super'を呼び出すのが意味をなさないためです。しかし、 'super.loadView()'を呼び出すと、 'self.view'を使うことができます。元の実装が' UIView'インスタンスを作成するため、 'self.view'を使うことができます。 – Sulthan

0

あなたは、いくつかのミスがあります:

override func loadView() 
     { 
      super.loadView() 
      scrollView = UIScrollView(frame:CGRectZero) 
      scrollView.backgroundColor = UIColor.whiteColor() 
      scrollView.setTranslatesAutoresizingMaskIntoConstraints(false) 

      // No need for sizeToFit with autoLayout 
      //scrollView.sizeToFit() 

      self.view.addSubview(scrollView) 
      scrollView.backgroundColor = UIColor.blueColor() 

      contentView = UIView() 

      //Always set TranslatesAutoresizingMaskIntoConstraints to false, on every view that users AutoLayout 

      contentView.setTranslatesAutoresizingMaskIntoConstraints(false) 
      contentView.backgroundColor = UIColor.redColor() 
      scrollView.addSubview(contentView) 

      var viewBindingsDictBoth = [String: AnyObject]() 
      viewBindingsDictBoth["scrollView"] = scrollView 
      viewBindingsDictBoth["contentView"] = contentView 
      viewBindingsDictBoth["mainView"] = self.view 


      view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[scrollView]-0-|",options: [], metrics: nil, views:viewBindingsDictBoth)) 

      view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[scrollView]-0-|",options: [], metrics: nil, views:viewBindingsDictBoth)) 

      view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[contentView]|",options: [], metrics: nil, views:viewBindingsDictBoth)) 
      view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[contentView]|",options: [], metrics: nil, views:viewBindingsDictBoth)) 

      view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[contentView(==mainView)]",options: [], metrics: nil, views:viewBindingsDictBoth)) 

      // self.view.contentMode = UIViewContentMode.Redraw 
     } 
関連する問題