以编程方式添加的约束不起作用
Posted
技术标签:
【中文标题】以编程方式添加的约束不起作用【英文标题】:Programmatically Added Constraint Not Working 【发布时间】:2016-04-16 13:33:51 【问题描述】:我一直在尝试以编程方式向视图添加约束,我也在以编程方式向视图控制器添加约束。但是,似乎没有遵循约束。
视图已添加到视图控制器的情节提要中,但直到稍后才真正添加到视图控制器的视图中(请参见下面的屏幕截图)。
我尝试添加各种约束,但到目前为止都没有奏效。我现在已将其简化为下面的单个约束,即使这样也行不通。我做错了什么?
@IBOutlet var loadingView: LoadingView!
override func viewDidLoad()
super.viewDidLoad()
displayLoadingView(true)
func displayLoadingView(display: Bool)
if display
view.addSubview(loadingView)
let widthConstraint = NSLayoutConstraint(item: loadingView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 50.0)
view.addConstraint(widthConstraint)
【问题讨论】:
你设置view.translatesAutoresizingMaskIntoConstraints = false
了吗?或以编程方式设置约束的任何视图
@Pyro 这正是我所缺少的。自从您第一次发布此内容以来,您可以将其发布为答案吗?
【参考方案1】:
将translatesAutoresizingMaskIntoConstraints = false
设置为您以编程方式设置约束的任何视图。
来自apple doc: translatesAutoresizingMaskIntoConstraints
如果要使用自动布局来动态计算视图的大小和位置,则必须将此属性设置为 false,然后为视图提供一组明确、不冲突的约束。
【讨论】:
实际上我必须设置loadingView.translatesAutoresizingMaskIntoConstraints = false
才能正常工作。但是这个答案肯定让我得到了我需要的地方。谢谢!
我对以编程方式添加约束并不陌生,但我仍然经常忘记这个小标志,想知道为什么我的约束不起作用。【参考方案2】:
您没有设置所有必要的约束,这可能是原因。考虑以下粗略的例子。 MyView 接口在独立的 xib 文件中定义。希望对您有所帮助:
class ViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
guard let myView = loadFromNib("MyView") else
return
view.addSubview(myView)
myView.translatesAutoresizingMaskIntoConstraints = false
view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-15-[myView]-15-|", options: NSLayoutFormatOptions.DirectionLeadingToTrailing, metrics: nil, views: ["myView": myView]))
view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-15-[myView]-15-|", options: NSLayoutFormatOptions.DirectionLeadingToTrailing, metrics: nil, views: ["myView": myView]))
func loadFromNib(cls: String) -> UIView?
return NSBundle.mainBundle().loadNibNamed(cls, owner: nil, options: nil)[0] as? UIView
【讨论】:
@Pyro 首先发布了translatesAutoresizingMaskIntoConstraints
,这正是我所需要的。但我很高兴看到constraintsWithVisualFormat
。这已经很有用了。以上是关于以编程方式添加的约束不起作用的主要内容,如果未能解决你的问题,请参考以下文章