Superview边缘的程序化自动布局约束

Posted

技术标签:

【中文标题】Superview边缘的程序化自动布局约束【英文标题】:Programmatic Auto Layout Constraints to Edges of Superview 【发布时间】:2019-02-07 04:54:25 【问题描述】:

我在 Xcode 的故事板编辑器中做了很多自动布局,但我很少在代码中做任何事情。在一个特定的例子中,我需要创建与这些约束等效的程序:

这些约束被添加到textView 并且父视图是另一个名为commentBox 的视图。到目前为止我已经尝试过了,但代码感觉多余,并导致冲突约束的自动布局错误:

//Trailing
textView.addConstraint(NSLayoutConstraint(item: textView, attribute: .trailing, relatedBy: .equal, toItem: cell.commentBox, attribute: .trailing, multiplier: 1, constant: 15))
//Leading
textView.addConstraint(NSLayoutConstraint(item: textView, attribute: .leading, relatedBy: .equal, toItem: cell.commentBox, attribute: .leading, multiplier: 1, constant: 15))
//Bottom
textView.addConstraint(NSLayoutConstraint(item: textView, attribute: .bottom, relatedBy: .equal, toItem: cell.commentBox, attribute: .bottom, multiplier: 1, constant: 10))
//Top
textView.addConstraint(NSLayoutConstraint(item: textView, attribute: .top, relatedBy: .equal, toItem: cell.commentBox, attribute: .top, multiplier: 1, constant: 10))

知道我做错了什么吗?谢谢!

【问题讨论】:

你关闭了textView.translatesAutoresizingMaskIntoConstraints = false吗? 您遇到了哪些冲突的约束?注意:对于 trailingbottom 约束,您希望 constant 值为负数。也就是说,您希望子视图的trailing 边缘位于父视图的trailing 边缘的15-pts 左侧...所以您想使用-15(和,按照逻辑,-10 用于 bottom 约束)。 【参考方案1】:

试试这个:

commentBox.addSubview(textView)

textView.translatesAutoresizingMaskIntoConstraints = false

textView.topAnchor.constraint(equalTo: commentBox.topAnchor, constant: 10).isActive = true
textView.bottomAnchor.constraint(equalTo: commentBox.bottomAnchor, constant: -10).isActive = true
textView.leadingAnchor.constraint(equalTo: commentBox.leadingAnchor, constant: 15).isActive = true
textView.trailingAnchor.constraint(equalTo: commentBox.trailingAnchor, constant: -15).isActive = true

【讨论】:

以上是关于Superview边缘的程序化自动布局约束的主要内容,如果未能解决你的问题,请参考以下文章

不遵守自动布局底部间距约束

动画自动布局`leftAnchor`约束更改

如何在imageView上设置自动布局约束以获得良好的分辨率图像?

iOS 自动布局约束刷新

自动布局中的多个标签和段视图

自动布局 - 定义应该改变哪个约束首先调整它的大小