Swift - UIView addConstraints不起作用

时间:2014-10-19 19:33:28

标签: ios swift nslayoutconstraint

我正在玩Swift,突然之间什么都没有出现。

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 取代 Diabolic UIView 时,会出现红色方块

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

所以,问题是,为什么我看不到UIView?

提前致谢:)

4 个答案:

答案 0 :(得分:1)

您的约束适用于UIButton因为按钮有 intrinsic content size - 他们可以决定他们想要的大小。

另一方面,

UIView没有。*您需要:

  • 添加约束以指定视图的大小,或
  • 子类UIView并覆盖intrinsicContentSize()以返回视图的默认大小。

设置当前正在尝试删除的框架尺寸 - 布局引擎会忽略此框架。


* - 此方法的默认实现返回CGSizeMake(UIViewNoIntrinsicMetric, UIViewNoIntrinsicMetric)(-1, -1),这就是您根本看不到自己视图的原因。

答案 1 :(得分: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

答案 2 :(得分:-1)

使用viewWillAppear()代替viewDidLoad()来更新约束。

答案 3 :(得分:-1)

你错过了一件事,那就是Diabolic UIView的x,y坐标。