2014-10-19 85 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