2014-10-19 83 views
0

我正在玩Swift,突然間什麼都沒有出現。Swift - UIView addConstraints不起作用

override func viewDidLoad() { 
    super.viewDidLoad() 

    var DiabolicView: UIView = UIView();//With UIButton it's working 
    DiabolicView.setTranslatesAutoresizingMaskIntoConstraints(false); 
    DiabolicView.frame.size = CGSize(width: 67, height: 67) 
    DiabolicView.backgroundColor = UIColor.redColor();//To see the view 
    view.addSubview(DiabolicView); 

    view.addConstraints([NSLayoutConstraint(item: DiabolicView, 
     attribute: .Bottom, 
     relatedBy: .Equal, 
     toItem: view, 
     attribute: .Bottom, 
     multiplier: 1.0, 
     constant: -100 
    )]); 
} 

是的,真的沒什麼(screen of nothing)

但是當我通過一個很酷的的UIButton更換惡魔的UIView,則紅場出現

Screen of the magic Red Square when I replace UIView by UIButton

所以,問題是,爲什麼我看不到UIView?

感謝提前:)

回答

1

因爲按鈕有intrinsic content size - 他們可以決定他們想要的大小,所以您的約束條件可以使用UIButton。 。

UIView,而另一方面,不*您需要:

  • 添加約束指定視圖的大小,或者
  • 子類UIView並重寫intrinsicContentSize()返回的默認大小你的看法。

設置當前嘗試的框架大小不會削減它 - 此框架被佈局引擎忽略。


* - 此方法的默認實現返回CGSizeMake(UIViewNoIntrinsicMetric, UIViewNoIntrinsicMetric),或(-1, -1),這就是爲什麼你沒有看到你的觀點的。

+0

超酷謝謝:):d – 2014-10-19 19:55:01

-1

使用viewWillAppear()而不是viewDidLoad()更新約束。

+0

謝謝,但沒有紅場:'( – 2014-10-19 19:51:25

-1

你錯過了一件事,那就是Diabolic UIView的x,y座標。

+0

試試這個view.layOutIfNeeded(),但這樣做在viewDidAppear – ZAZ 2014-10-19 19:52:06

+0

支票轉換成autoresizingmask約束上 – ZAZ 2014-10-19 20:14:30

1

感謝Aaron Brager,我可以看到Reeed Squaaare !!!

import UIKit 

class SweetView: UIView { 
    override func intrinsicContentSize() -> CGSize { 
     return CGSize(width: 67, height: 67); 
    } 
} 

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     var DiabolicView: SweetView = SweetView(); 
     DiabolicView.setTranslatesAutoresizingMaskIntoConstraints(false); 
     DiabolicView.backgroundColor = UIColor.redColor();//To see the view 
     view.addSubview(DiabolicView); 

     view.addConstraints([NSLayoutConstraint(item: DiabolicView, 
      attribute: .Bottom, 
      relatedBy: .Equal, 
      toItem: view, 
      attribute: .Bottom, 
      multiplier: 1.0, 
      constant: -100 
     )]); 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 

謝謝! :d