在 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 中以编程方式添加约束不起作用的主要内容,如果未能解决你的问题,请参考以下文章