在 Swift 中以编程方式添加约束不起作用

Posted

技术标签:

【中文标题】在 Swift 中以编程方式添加约束不起作用【英文标题】:Programmatically adding constraints in Swift does not work 【发布时间】:2015-12-17 09:59:19 【问题描述】:

我添加了以下代码以使以编程方式添加的视图居中:

let horizontalConstraint = NSLayoutConstraint(item: newView!, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)
view.addConstraint(horizontalConstraint)

它不起作用。视图未居中。它还在左边。

编辑:

    override func viewDidLoad() 
    super.viewDidLoad()

    newView = LineChartView(frame: CGRectMake(0, 0, 50, 50))
    newView?.delegate = self
    newView?.drawBordersEnabled = true
    newView?.noDataText = "No Data"
    newView?.noDataTextDescription = "No Data"
    newView?.borderColor = UIColor.blackColor()

    self.view.addSubview(newView!)

【问题讨论】:

你能在newView初始化的地方显示你的代码吗? 尝试添加newView?.setTranslatesAutoresizingMaskIntoConstraints(false) @hannad "'LineChartView' 类型的值没有成员 'setTranslatesAutoresizingMaskIntoConstraints'" newView?.translatesAutoresizingMaskIntoConstraints = false 还有你在哪里设置newView的约束? 【参考方案1】:

朋友,你需要选择一边,如果你使用自动布局,不要用frame初始化你的对象。试试这样的...

var newView:LineChartView!

override func viewDidLoad() 
    super.viewDidLoad()

    newView = LineChartView()
    newView.translatesAutoresizingMaskIntoConstraints = false
    newView.delegate = self
    newView.drawBordersEnabled = true
    newView.noDataText = "No Data"
    newView.noDataTextDescription = "No Data"
    newView.borderColor = UIColor.blackColor()
    self.view.addSubview(newView)

    let width = NSLayoutConstraint(item: newView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 50)
    let height = NSLayoutConstraint(item: newView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 50)
    newView.addConstraint(width)
    newView.addConstraint(height)
    let x = NSLayoutConstraint(item: newView, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 0)
    let y = NSLayoutConstraint(item: newView, attribute: .CenterY, relatedBy: .Equal, toItem: self.view, attribute: .CenterY, multiplier: 1, constant: 0)
    self.view.addConstraint(x)
    self.view.addConstraint(y)


如果您的 LineChartView 对象是 UIView 的子类,那么这应该可以工作,并且您的超级视图中间应该有一个 50x50 的对象。

如果你要在代码中做这样的约束,你应该考虑使用 Apples Visual Formatting Language。

【讨论】:

就我个人而言,我仍然会使用 CGRectZero 的框架来初始化 LineChartView,因为 initWithFrame:UIView 的两个指定初始化程序之一。是的,init() for UIView 无论如何都会调用 initWithFrame:CGRectZero,但正确的初始化流程更加明确。 当我移除框架并且只有双括号时,视图消失了。 实际上我用你的代码替换了我的代码,现在它可以工作了。回答接受。谢谢。

以上是关于在 Swift 中以编程方式添加约束不起作用的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建布局,使用堆栈视图和约束不起作用

Swift编程约束下边距不起作用

以编程方式添加的约束不起作用

以编程方式添加约束不起作用

如何在iOS中以编程方式从UIButton中删除等宽约束

未能尝试在 SWIFT 中以编程方式在滚动视图中添加 UIView 约束